2011-11-02 27 views
13

我想在Rdata.frame的基础上添加一列基于因子列的均值。像这样:向原始数据中添加一列分组方法

df1 <- data.frame(X = rep(x = LETTERS[1:2], each = 3), Y = 1:6) 
df2 <- aggregate(data = df1, Y ~ X, FUN = mean) 
df3 <- merge(x = df1, y = df2, by = "X", suffixes = c(".Old",".New")) 
df3 
# X Y.Old Y.New 
# 1 A  1  2 
# 2 A  2  2 
# 3 A  3  2 
# 4 B  4  5 
# 5 B  5  5 
# 6 B  6  5 

要完成这个问题,我必须创建两个不必要的data.frames。我想知道一种方法,可以在原始data.frame中添加一列按因子列的方式,而不会创建任何额外的data.frames。感谢您的时间和帮助。

回答

12

这是ave函数的用途。这样做的

df1$Y.New <- ave(df1$Y, df1$X) 
+0

这就是我一直在寻找。谢谢 – MYaseen208

7

ddplytransform救援(虽然我敢肯定,你会得到至少4种不同的方式来做到这一点):

library(plyr) 
ddply(df1,.(X),transform,Y.New = mean(Y)) 
    X Y Y.New 
1 A 1  2 
2 A 2  2 
3 A 3  2 
4 B 4  5 
5 B 5  5 
6 B 6  5 
4

Joran回答精美,这是不是一个回答你的问题,但对话的延伸。如果你正在寻找的方式表两个分类变量的一个依赖关系,这里是为哈德利功能:

cast(CO2, Type ~ Treatment, value="uptake", fun.aggregate=mean, margins=TRUE) 

这里的CO2数据的头图,一看意指表:

> head(CO2) 
    Plant Type Treatment conc uptake 
1 Qn1 Quebec nonchilled 95 16.0 
2 Qn1 Quebec nonchilled 175 30.4 
3 Qn1 Quebec nonchilled 250 34.8 
4 Qn1 Quebec nonchilled 350 37.2 
5 Qn1 Quebec nonchilled 500 35.3 
6 Qn1 Quebec nonchilled 675 39.2 

> library(reshape) 

> cast(CO2, Type ~ Treatment, mean, margins=TRUE) 
     Type nonchilled chilled (all) 
1  Quebec 35.33333 31.75238 33.54286 
2 Mississippi 25.95238 15.81429 20.88333 
3  (all) 30.64286 23.78333 27.21310 
9

两种可选的方式:

1.dplyr包:

library(dplyr) 
df1 <- df1 %>% 
    group_by(X) %>% 
    mutate(Y.new = mean(Y)) 

2.data.table包:

library(data.table) 
setDT(df1)[, Y.new := mean(Y), by = X] 

均可以得到以下结果:

> df1 
    X Y Y.new 
1: A 1  2 
2: A 2  2 
3: A 3  2 
4: B 4  5 
5: B 5  5 
6: B 6  5