在原始数据中添加一列组的手段

我想在R data.frame添加一列基于因子列的data.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 

要完成这个问题,我必须创build两个不必要的data.frames 。 我想知道一种方法来追加一列因子列的手段到我原来的data.frame没有创build任何额外的data.frames 。 感谢您的时间和帮助。

这是大家的function。

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

两种替代方法:

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 XY 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 

ddplytransform为救援(虽然我相信你会得到至less4种不同的方式来做到这一点):

 library(plyr) ddply(df1,.(X),transform,Y.New = mean(Y)) XY 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 

乔兰精美地回答,这不是对你的问题的回答,而是对话的延伸。 如果你正在寻找两个分类variables与依赖关系的平均值表,那么Hadley函数就是这样的:

 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