R 在数据帧中重复应用ave计算组平均值
以下代码根据R 在数据帧中重复应用ave计算组平均值,r,R,以下代码根据组分别产生x和y的组平均值。假设我有许多变量,对它们重复相同的操作 为了通过单个命令获得相同的结果,您建议如何继续?(我想有必要采用tapply,但我不是很确定.) x=seq(1,11,by=2);y=序列(2,12,by=2);组=代表(1:2,每个=3) dat假设您有两个以上的列,您可能希望使用apply将ave应用于矩阵中的每一列 x=seq(1,11,by=2); y=seq(2,12,by=2); group=rep(1:2, each=3) dat <- cbi
组
分别产生x
和y
的组平均值。假设我有许多变量,对它们重复相同的操作
为了通过单个命令获得相同的结果,您建议如何继续?(我想有必要采用tapply
,但我不是很确定.)
x=seq(1,11,by=2);y=序列(2,12,by=2);组=代表(1:2,每个=3)
dat假设您有两个以上的列,您可能希望使用apply
将ave
应用于矩阵中的每一列
x=seq(1,11,by=2); y=seq(2,12,by=2); group=rep(1:2, each=3)
dat <- cbind(x, y)
ave.dat <- apply(dat, 2, function(column) ave(column, group))
# x y
# [1,] 1 2
# [2,] 3 4
# [3,] 5 6
# [4,] 7 8
# [5,] 9 10
# [6,] 11 12
x=seq(1,11,by=2);y=序列(2,12,by=2);组=代表(1:2,每个=3)
dat使用数据的替代解决方案。表
和plyr
包:
1) 使用数据表
require(data.table)
dt <- data.table(dat, key="group")
# Following @Matthew's comment, edited:
dt[, `:=`(m_x = mean(x), m_y = mean(y)), by=group]
2) 使用plyr
和变换:
require(plyr)
ddply(dat, .(group), transform, m_x=mean(x), m_y=mean(y))
输出:
group x y m_x m_y
1 1 1 2 3 4
2 1 3 4 3 4
3 1 5 6 3 4
4 2 7 8 9 10
5 2 9 10 9 10
6 2 11 12 9 10
3) 使用plyr
和numcolwise(注意减少的输出):
输出:
group x y
1 1 3 4
2 2 9 10
您还可以使用aggregate():
dat2您是否有两个以上的列要应用此项(不仅仅是x和y)?(如果您只有两个,那么您的解决方案似乎是最简单的——您几乎不需要将其压缩为一个命令)。对不起,我编辑了初始问题请参见下面的答案,这将创建一个新的矩阵,其中每个列都已使用ave
进行了修改。如果您需要将其放入数据框中(或需要将其放入原始数据框中),则可以非常简单地进行修改。sapply(dat,ave,dat$group)
。不过,我建议您使用plyr::ddply
或data.table
。谢谢!是否可以直接获得一个数据帧作为最终结果?可以只做as.data.frame(ave.dat)
非常感谢,非常有启发性+我也是。顺便说一句,您可以在同一分组步骤中通过引用添加两列,以保存分组两次:dt[,`:=`(m_x=mean(x),m_y=mean(y)),by=group]
。
group x y m_x m_y
1 1 1 2 3 4
2 1 3 4 3 4
3 1 5 6 3 4
4 2 7 8 9 10
5 2 9 10 9 10
6 2 11 12 9 10
ddply(dat, .(group), numcolwise(mean))
group x y
1 1 3 4
2 2 9 10
dat2 <- data.frame(dat, aggregate(dat[,-1], by=list(dat$group), mean)[group, -1])
dat2
group x y x.1 y.1
1 1 1 2 3 4
1.1 1 3 4 3 4
1.2 1 5 6 3 4
2 2 7 8 9 10
2.1 2 9 10 9 10
2.2 2 11 12 9 10
row.names(dat2) <- rownames(dat)
colnames(dat2) <- gsub("(.)\\.1", "m_\\1", colnames(dat2))
dat2
group x y m_x m_y
1 1 1 2 3 4
2 1 3 4 3 4
3 1 5 6 3 4
4 2 7 8 9 10
5 2 9 10 9 10
6 2 11 12 9 10