簡體   English   中英

r-使用匯總與列表進行條件平均

[英]r - Conditional Averaging using Aggregate with lists

我正在嘗試編寫腳本來簡化一些數據分析,並且在某些時候,我需要對類似於以下內容的一些子列表取平均值:

> 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

它通過處理正確地在復制列中返回了均值,但是我不太確定為什么在此之后它會返回不同的值。 我猜想這個數據結構可能與均值函數不兼容,但是我不確定為什么重復均值是正確的。 有沒有更好的方法可以在列表中進行這種條件平均,還是嘗試將所有內容重新構造為數據框會更好?

可能您的列是所有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM