указать имена столбцов dplyr

Как я могу передать имена столбцов в dplyr, если я не знаю имени столбца, но хочу указать его через переменную?

например это работает:

require(dplyr)
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(group) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

Но это не

require(dplyr)
someColumn = "group"
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(someColumn) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

person user3241888    schedule 27.01.2014    source источник
comment
да возможно. В итоге я переименовал столбец группы перед цепочкой dplyr. что-то вроде colnames(df)[which(colnames(df)==someColumn)] <- "group"   -  person user3241888    schedule 28.01.2014
comment
Стоит отметить, что «правильный» ответ, вероятно, отличается от приведенных ниже решений для dplyr 0.7.0.   -  person russellpierce    schedule 01.08.2017


Ответы (5)


Я только что дал аналогичный ответ в Группировать по нескольким столбцам в dplyr, используя строковый векторный ввод, но на всякий случай: в dplyr добавлены функции, которые позволяют вам работать со столбцами, используя строки. Они имеют то же имя, что и обычные функции dplyr, но заканчиваются символом подчеркивания. Функции подробно описаны в этой зарисовке.

Учитывая df и someColumn из OP, теперь это работает:

gdf <- df %>% group_by_(someColumn) %>% summarise(m1=mean(V1),m2=mean(V2),m3=mean(V3))

Обратите внимание, что это group_by_, а не group_by, и оператор %>% используется, поскольку %.% устарел.

person edward    schedule 31.10.2014
comment
Можете ли вы указать m1 как имя переменной, переданной в функцию? - person vashts85; 16.08.2018

Вот ответ на этот простой вопрос, полученный путем подбора решения Хэдли к его опубликованному обману.

gdf <- df %.% regroup( lapply( someColumn, as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

FWIW, мой вариант использования включал группировку по одному столбцу переменной и одному столбцу константы. Решение этого:

gdf <- df %.% regroup( lapply( c( 'constant_column', someColumn), as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

Наконец, опубликованное решение eval не работает. Это просто создает новый столбец, значения которого соответствуют someColumn evals.

person StatSandwich    schedule 04.02.2014

Вы можете использовать summarise_ следующим образом:

plotVar         = "Stocks_US_TotalCrudeOil"
dfBand <- mydf[ c( plotVar ,  "year", "week"  )  ] %>%
            filter ( year %in% bandYears )   %>%
            group_by (  week )   %>% 
            summarise_ (   ymini =  paste( "min(" ,  as.name(plotVar)  ,")"  ) 
                         , ymaxi =  paste( "max(" ,  as.name(plotVar)  ,")"  )     )
dfBand
person ashkan    schedule 21.10.2015

введите здесь описание изображения

pollutant <- "sulfate"
summarise(data, mean(eval(as.symbol(pollutant)), na.rm = TRUE))

Я пытался задать тот же вопрос для моей собственной проблемы. Тогда я нашел решение для него. Я инкапсулирую выражение с помощью eval(as.symbol()).

person CheJharia    schedule 16.05.2014
comment
Кажется, не работает с моей текущей версией dplyr - person Calimo; 04.11.2014

Я ожидаю, что вам просто нужно использовать eval

require(dplyr)
someColumn = "group"
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(eval(someColumn)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))
person Floris Padt    schedule 02.02.2014
comment
Это вообще не работает, просто добавляется новый столбец с именем eval(someColumn), где каждая строка равна "group". - person Gregor Thomas; 17.05.2014