【问题标题】:Mean of triplicate一式三份的平均值
【发布时间】:2013-01-18 13:02:17
【问题描述】:

我刚刚清理了一个从 Excel 电子表格中抓取的数据框,其中包括从一些数字中删除百分比符号,参见 Removing Percentages from a Data Frame

数据有 24 行,代表一式三份进行的八次实验的参数和结果。例如,一个人会从中得到什么,

DF1 <- data.frame(X = 1:24, Y = 2 * (1:24), Z = 3 * (1:24))

我想找到每个三次的平均值(幸运的是,它们是按顺序排列的)并创建一个具有八行和相同数量列的新数据框。

我尝试使用,

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

我手工制作的;它应该是减少的结果。

谢谢,...

任何帮助将不胜感激。

【问题讨论】:

标签: r dataframe mean


【解决方案1】:

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)

【讨论】:

  • 感谢您的两个回答。第一个是否返回一个 data.frame 而第二个返回一个矩阵?我问是因为 R 返回结果的方式看起来略有不同。
  • @user1945827,完全正确。您可以使用as.matrixas.data.frame 对它们进行类型转换。
  • 在第一个答案中,当我用 nrow(DF1) 更改“8”时,我得到一个错误返回。不知道为什么,我想你可能想知道。
  • @user1945827 - 为我工作。你得到什么错误? DF1 仍然是您在问题中定义的原始 data.frame 吗?
  • "DF1 还是原来的吗..."。啊,不。你自己和其他人提供的其他代码已经绰绰有余了。明天我会重新生成错误并在这里发回。
【解决方案2】:

这行得通:

foo <- matrix(unlist(by(data=DF1,INDICES=rep(1:8,each=3),FUN=colMeans)),
  nrow=8,byrow=TRUE)
colnames(foo) <- colnames(DF1)

?by

【讨论】:

  • 嗨@Stephan,你的代码几乎可以工作。我失去了我的列标题。我使用'data.frame'而不是'matrix'再次尝试了脚本,但这返回了一团糟。如果没有其他内容,我会坚持使用您的脚本并使用“名称”将标题放回原处。谢谢,
  • 我编辑了代码以添加colnames。但无论如何,@Tomas 的解决方案要漂亮得多,所以对他 +1。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2016-07-08
  • 2022-11-03
  • 2017-04-15
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多