2014-01-27 13 views
18

Как передать имена столбцов в 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)) 
+0

да, возможно. Я закончил переименование столбца группы перед цепочкой dplyr. что-то вроде 'colnames (df) [which (colnames (df) == someColumn)] <-" group "' – user3241888

+0

Стоит отметить, что «правильный» ответ, вероятно, отличается от решений ниже под dplyr 0.7.0. – russellpierce

ответ

-2

Я ожидаю, что вы просто должны использовать 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)) 
+0

Это не работает вообще, просто добавляет новый столбец с именем 'eval (someColumn)', где каждая строка является '' группой ". – Gregor

3

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

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 решение не работает. Это просто создает новый столбец, значения которого равны someColumneval s. Я еще не достаточно крут, чтобы оставить комментарий или уменьшить его.

-1

enter image description here

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

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

+0

Кажется, что не работает с моей текущей версией dplyr – Calimo

18

Я только что дал аналогичный ответ на Group by multiple columns in dplyr, using string vector input, но для хорошей меры: функции, которые позволяют вам работать с столбцами с использованием строк, были добавлены к dplyr. Они имеют то же имя, что и обычные функции dplyr, но заканчиваются символом подчеркивания. Функции подробно описаны в this vignette.

Учитывая df и someColumn из ОП, это теперь работает лакомство:

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

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

0

Вы можете использовать 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