2013-06-26 4 views
1

Итак, у меня есть конфигурационный фрейм, который будет определять, как я хочу объединить несколько столбцов в другой фрейм.Агрегирование динамической базы данных с именами столбцов в строках из другого фрейма данных

конфигурации рамы:

conf <- rbind(                                         
    c("a", "cnt"),                                      
    c("b", "cnt")                               
    )                                             

И dataframe данных

dd <- data.frame(cbind(c("a1", "a1", "a1"), c("b1", "b1", "b2"), c(1, 2, 3))) 
names(dd) <- c("a", "b", "cnt") 

И я хочу, чтобы запустить в основном эту команду:

aggregate(cnt ~ paste(conf[, 1], collapse=" + "), data=dd, sum) 

Какой бы идеально вернуться

output 
a1 b1 3 
a1 b2 3 

Имеют смысл? Я чувствую, что мне не хватает чего-то с do.call или eval при получении динамических имен столбцов. Или, возможно, пересечение списка имен (dd) с conf [, 1]

+1

Я думаю, вы имеете в виду 'COLNAMES (дд)' '..на имена (дд)' – agstudy

+2

Вы должны быть в состоянии использовать '? as.formula' – Justin

+0

as.formula было совершенно то, что я искал. Благодаря! – mcpeterson

ответ

2

Это выглядит проще мне (после коррекции ваших греховных путей):

dd <- data.frame(c("a1", "a1", "a1"), c("b1", "b1", "b2"), c(1, 2, 3)) 
names(dd) <- c("a", "b", "cnt") 

aggregate(dd$cnt , dd[ as.character(conf[, 1]) ], sum) 
#-------- 
    a b x 
1 a1 b1 3 
2 a1 b2 3 
1

Кража @ Предложение Юстина вот что я в итоге сделал.

aggregate(as.formula(paste("cnt", 
          paste(conf[,1], collapse=" + "), 
          sep=" ~ ")), data=dd, sum) 
+1

Что не удалось предоставить данные, которые вы предложили, потому что вы согрешили против R и использовали 'data.frame (cbind (...))' –