我刚刚清理了一个我从excel电子表格中删除的数据框,除去了某些数字中的百分号,见Removing Percentages from a Data Frame。
数据有二十四行,代表参数和一式三份进行的八次实验的结果。例如,一个人会得到什么,
DF1 <- data.frame(X = 1:24, Y = 2 * (1:24), Z = 3 * (1:24))
我想找到每个三次重复的平均值(幸运的是按顺序排列)并创建一个包含8行和相同数量列的新数据框。
我尝试使用
执行此操作DF2 <- data.frame(replicate(3,sapply(DF1, mean)))
这给了我每列的平均值作为行三次。我想得到一个能给我的数据框,
data.frame(X = c(2,5,8,11,14,17,20,23), Y = c(4,10,16,22,28,34,40,23), Z = c(6,15,24,33,42,51,60,69))
我手工制作的;它应该是减少的结果。
谢谢,......
任何帮助都会感激不尽。
答案 0 :(得分:4)
codegolf的好任务!
aggregate(DF1, list(rep(1:8, each=3)), mean)[,-1]
更一般地说,您应该将8
替换为nrow(DF1)
。
...或者,我最喜欢的,使用矩阵乘法:
t(t(DF1) %*% diag(8)[rep(1:8,each=3),]/3)
答案 1 :(得分:1)
这有效:
foo <- matrix(unlist(by(data=DF1,INDICES=rep(1:8,each=3),FUN=colMeans)),
nrow=8,byrow=TRUE)
colnames(foo) <- colnames(DF1)
查看?by
。