2015-09-15 33 views
1

我想编写一个脚本来简化一些数据分析,并在某些时候我需要遇到一些子列表类似于平均值:的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 

要做到这一点,我尝试使用聚合函数来将所有其他列的平均值作为处理列的函数,但这只对第一列成功,然后返回绝对不是均值的数字。

> 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 

它正确返回意味着通过治疗复制列,但当时我不明白为什么它返回的东西后的不同。我猜想这个数据结构可能与平均函数不兼容,但是我不确定为什么重复平均值是正确的。有没有更好的方法在列表中进行这种有条件的平均,还是将所有东西都重构为数据框会更好?

+3

它看起来像所有的列都是因素。用'sapply(temp1 [[1]],class)'检查。您想要将它们转换为整数。 – jenesaisquoi

回答

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 

注意到所有手段的人,因为他们是因素转换为数字。为了解决这个问题,您应该以适当的方式将列转换为数字(例如,使用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