У меня есть фрейм данных, который необходимо суммировать по столбцу B в один фрейм данных. Мне также нужно суммировать этот фрейм данных по столбцу A в другой фрейм данных. Для контекста столбец B является подстолбцом столбца A в иерархии. Мне также нужны только столбцы C:E, поэтому я решил, что dplyr будет наиболее полезным.
A | B | C | D | E | F | G
-------------------------------------
1 1A 3 4 5 3 2
1 1B 4 4 4 4 3
2 2A 2 2 2 2 2
...
Моя команда решила, что функция будет наиболее эффективным способом написать это, чтобы получить более чистый код. Если бы я хотел обобщить фрейм данных по столбцу A, я бы написал сценарий примерно так:
df %>%
select(A, C, D, E) %>%
group_by(A) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)
и Б, например:
df %>%
select(B, C, D, E) %>%
group_by(B) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)
Я изо всех сил пытаюсь перевести это в функцию, которая работает для любого сценария. Вот что у меня есть до сих пор:
slicedata <- function(df, column_name){
df %>%
select(column_name, C, D, E) %>%
group_by(column_name) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)
}
Но когда я передаю столбец B в качестве аргумента этой функции, я получаю следующее:
slicedata(df, B)
Error in .f(.x[[i]], ...) : object 'B' not found
В основном: я пытаюсь написать функцию для этого фрейма данных, которая позволяет мне агрегировать целые столбцы по тому столбцу, который я передаю в качестве аргумента. Однако я не понимаю, почему эта ошибка появляется.
Мы можем использовать enquo
, чтобы преобразовать его в квазуру, а затем оценить с помощью !!
slicedata <- function(df, column_name){
column_name = enquo(column_name)
df %>%
select(!!column_name, C, D, E) %>%
group_by(!!column_name) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)
}
slicedata(df, B)
@AENick В контексте tidyverse он оценивает соотношение
Спасибо! Это очень помогает. Я не совсем знаком с техническими особенностями R... что значит "!!" делать?