2015-01-16 4 views
3

У меня есть кадр данных. Я хочу объединить один столбец из него на основе другого списка.R: агрегировать кадр данных на основе определенных условий

df<-data.frame(X=c("a", "b", "c", "d"), Y=c(0.5, 0.4, 0.01, 0.09)) 
X  Y 
a  0.5 
b  0.4 
c  0.01 
d  0.09 

l<-c("a", "c", "d") 

l Список, который необходимо сгруппировать. Итак, здесь я хочу сгруппировать все элементы в df$X, которые есть в l.

My desired result is: 
X  Y 
a' 0.6 
b  0.4 

Любая идея о том, как это сделать?

Спасибо.

ответ

4

Мы можем «временно» изменить соответствующие значения X на одну и ту же переменную группировки, а затем агрегировать. Здесь я произвольно выбирать l[1], который также бывает "a"

aggregate(Y ~ X, within(df, X <- replace(X, X %in% l, l[1])), sum) 
# X Y 
# 1 a 0.6 
# 2 b 0.4 

Один потенциал роста этого использования within() в aggregate() вызова является то, что первоначальный df останется неизменным.

1

Возможность использования data.table

library(data.table) 
df1 <- copy(df) 
setkey(setDT(df1), X)[l, X:='a'][, list(Y=sum(Y)), X] 
# X Y 
#1: a 0.6 
#2: b 0.4