z = data.frame(labels=c("a","a","b","c","c"),data=matrix(1-6ren">
gpt4 book ai didi

r - 将 R 的 "by"命令的输出转换为数据帧

转载 作者:行者123 更新时间:2023-12-04 09:36:37 25 4
gpt4 key购买 nike

我正在尝试使用 R 的 by命令获取数据框子集的列均值。例如,考虑这个数据框:

> z = data.frame(labels=c("a","a","b","c","c"),data=matrix(1:20,nrow=5))
> z
labels data.1 data.2 data.3 data.4
1 a 1 6 11 16
2 a 2 7 12 17
3 b 3 8 13 18
4 c 4 9 14 19
5 c 5 10 15 20

我可以使用 R 的 by根据标签列获取列的命令:
> by(z[,2:5],z$labels,colMeans)
z[, 1]: a
data.1 data.2 data.3 data.4
1.5 6.5 11.5 16.5
------------------------------------------------------------
z[, 1]: b
data.1 data.2 data.3 data.4
3 8 13 18
------------------------------------------------------------
z[, 1]: c
data.1 data.2 data.3 data.4
4.5 9.5 14.5 19.5

但是如何将输出强制返回到数据帧? as.data.frame不起作用...
> as.data.frame(by(z[,2:5],z$labels,colMeans))
Error in as.data.frame.default(by(z[, 2:5], z$labels, colMeans)) :
cannot coerce class '"by"' into a data.frame

最佳答案

您可以使用 ddply来自 plyr包裹

library(plyr)
ddply(z, .(labels), numcolwise(mean))
labels data.1 data.2 data.3 data.4
1 a 1.5 6.5 11.5 16.5
2 b 3.0 8.0 13.0 18.0
3 c 4.5 9.5 14.5 19.5

aggregate来自 stats
aggregate(z[,-1], by=list(z$labels), mean)
Group.1 data.1 data.2 data.3 data.4
1 a 1.5 6.5 11.5 16.5
2 b 3.0 8.0 13.0 18.0
3 c 4.5 9.5 14.5 19.5

dcast来自 reshape2包裹
library(reshape2)
dcast( melt(z), labels ~ variable, mean)

使用 sapply :
 t(sapply(split(z[,-1], z$labels), colMeans))
data.1 data.2 data.3 data.4
a 1.5 6.5 11.5 16.5
b 3.0 8.0 13.0 18.0
c 4.5 9.5 14.5 19.5

关于r - 将 R 的 "by"命令的输出转换为数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12389301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com