簡體   English   中英

R:data.frame的聚合列

[英]R: aggregate columns of a data.frame

我有一個看起來像這樣的data.frame

> head(df)
            Memory    Memory    Memory    Memory    Memory     Naive     Naive
10472501  6.075714  5.898929  6.644946  6.023901  6.332126  8.087944  7.520194
10509163  6.168941  6.495393  5.951124  6.052527  6.404401  7.152890  8.335509
10496091 10.125575  9.966211 10.075613 10.310952 10.090649 11.803949 11.274480
10427035  6.644921  6.658567  6.569745  6.499243  6.990852  8.010784  7.798154
10503695  8.379494  8.153917  8.246484  8.390747  8.346748  9.540236  9.091740
10451763 10.986717 11.233819 10.643245 10.230697 10.541396 12.248487 11.823138  

我想找到Memory列的平均值和Naive列的平均值。 aggregate函數聚合行。 這個data.frame可能有大量的行,因此轉置然后通過原始data.framecolnames應用aggregate使我感覺很糟糕,並且通常很煩人:

> head(t(aggregate(t(df),list(colnames(df)), mean)))
         [,1]       [,2]      
Group.1  "Memory"   "Naive"   
10472501 "6.195123" "8.125439"
10509163 "6.214477" "7.733625"
10496091 "10.11380" "11.55348"
10427035 "6.672665" "8.266854"
10503695 "8.303478" "9.340436"

我錯過了一件令人眼花繚亂的明顯事情?

我是重新格式化數據的主要倡導者,因此它采用“長”格式。 當涉及到像這樣的問題時,長格式的效用尤其明顯。 幸運的是,使用reshape包將這樣的數據重新塑造成幾乎任何格式都很容易。

如果我理解你的問題,那么你想要每行的MemoryNaive的意思。 無論出於何種原因,我們需要為reshape::melt()唯一的列名。

colnames(df) <- paste(colnames(df), 1:ncol(df), sep = "_")

然后,您將必須創建一個ID列。 你可以做到

df$ID <- 1:nrow(df)

或者,如果這些rownames是有意義的

df$ID <- rownames(df)

現在,使用reshape

library(reshape)
df.m <- melt(df, id = "ID")
df.m <- cbind(df.m, colsplit(df.m$variable, split = "_", names = c("Measure", "N")))
df.agg <- cast(df.m, ID ~ Measure, fun = mean)

df.agg現在應該看起來像你想要的輸出snippit。

或者,如果你只想要所有行的整體意義,Zack的建議將起作用。 就像是

m <- colMeans(df)
tapply(m, colnames(df), mean)

您可以獲得相同的結果,但格式化為數據框

cast(df.m, .~variable, fun = mean)

怎么樣的

l <-lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x]))



df <- do.call(cbind.data.frame, l)

澄清Jonathan Chang的答案......你忽略的一個明顯的事情就是你可以選擇列並發出rowMeans命令。 那將為每一行提供均值的向量。 他的命令獲取每組唯一列名的行方式,這正是我要編寫的內容。 使用您的示例數據,他的命令結果是兩個列表。

rowMeans也非常快。

要打破它,只獲取所有內存列的方法

rowMeans(df[,colnames(df) == 'Memory']) #or from you example, rowMeans(df[,1:5])

這是最簡單的完整正確答案,如果你願意的話,將他投票並標記為正確答案。

(順便說一句,我也很喜歡Jo的建議,即保留一些長期數據。)

m = matrix(1:12,3)
colnames(m) = c(1,1,2,2)

m

     1 1 2  2
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

mt = t(m)
sapply(by(mt,rownames(mt),colMeans),identity)

     1    2
V1 2.5  8.5
V2 3.5  9.5
V3 4.5 10.5

我認為你已經加載了沒有header=TRUE數據,你擁有的是一個因子矩陣,所以你的一般好主意失敗了。

暫無
暫無

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

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