r - 使用带列表的聚合的条件平均

时间:2015-09-15 19:14:42

标签: r

我正在尝试编写一个脚本来简化一些数据分析,在某些时候我需要对一些类似的子列表取平均值:

> temp1[[1]]
      Replicate Week Treatment aaa bbb ccc ddd eee
C1_T0         1    0      Cold   1   2   3   4   5
C2_T0         2    0      Cold   1   2   3   4   5
C3_T0         3    0      Cold   1   2   3   4   5
C4_T0         4    0      Cold   1   2   3   4   5
H1_T0         1    0       Hot   1   2   3   4   5
H2_T0         2    0       Hot   1   2   3   4   5
H3_T0         3    0       Hot   1   2   3   4   5
H4_T0         4    0       Hot   1   2   3   4   5

为此,我尝试使用聚合函数将所有其他列的平均值作为处理列的函数,但这仅对第一列成功,然后返回绝对不是均值的数字。 / p>

> temp10 <- aggregate( . ~ Treatment, temp1[[1]], mean)
> temp10
  Treatment Replicate Week aaa bbb ccc ddd eee
1      Cold       2.5    1   1   1   1   1   1
2       Hot       2.5    1   1   1   1   1   1

它通过治疗正确地返回了复制列中的平均值,但之后我不太清楚为什么它会在那之后返回不同的东西。我猜这个数据结构可能与平均函数不兼容,但后来我不确定为什么重复的意思是正确的。是否有更好的方法在列表中进行这种类型的条件平均,或者尝试将所有内容重组为数据帧会更好吗?

1 个答案:

答案 0 :(得分:0)

您的列可能都是factors而不是numeric,在执行此类计算之前,您应该始终检查data.frame列的类,因为,不幸的是,aggregate不会警告你它采取了一些因素(这可能根本没有意义)。

要了解正在发生的事情,请查看在使用数字转换因子时会发生什么:

as.numeric(as.factor(c(10, 10, 10, 10)))
[1] 1 1 1 1

所以,重现你的问题:

df <- read.table(text = "Replicate Week Treatment aaa bbb ccc ddd eee
C1_T0         1    0      Cold   1   2   3   4   5
C2_T0         2    0      Cold   1   2   3   4   5
C3_T0         3    0      Cold   1   2   3   4   5
C4_T0         4    0      Cold   1   2   3   4   5
H1_T0         1    0       Hot   1   2   3   4   5
H2_T0         2    0       Hot   1   2   3   4   5
H3_T0         3    0       Hot   1   2   3   4   5
H4_T0         4    0       Hot   1   2   3   4   5", header = TRUE)

df[-1] <- lapply(df[-1], as.factor)
temp10 <- aggregate( . ~ Treatment, df, mean)
temp10
  Treatment Replicate Week aaa bbb ccc ddd eee
1      Cold       2.5    1   1   1   1   1   1
2       Hot       2.5    1   1   1   1   1   1

请注意,所有方法都是1,因为它们是转换为数字的因子。为了纠正这种情况,您应该以适当的方式将列转换为数字(例如,使用as.numeric(as.character(x))),或者确保正确导入数据。这样做,aggregate将为您提供所需的答案:

columns <- c("Week", "aaa", "bbb", "ccc", "ddd", "eee")
df[columns] <- lapply(df[columns], function(x) as.numeric(as.character(x)))
temp10 <- aggregate( . ~ Treatment, df, mean)
temp10
  Treatment Replicate Week aaa bbb ccc ddd eee
1      Cold       2.5    0   1   2   3   4   5
2       Hot       2.5    0   1   2   3   4   5