2015-09-15 56 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