2014-11-20 72 views
0

我有一個名爲subdata的數據框,其維數爲10299 x 81.列1稱爲「主題」,列2稱爲「活動」。我想計算按「主題」和「活動」分組的每列的平均值。將R函數應用於按多種因素分組的數據框

以下是我嘗試過的功能,目前看起來沒有任何功能。最後我使用了colwise(mean)函數,它似乎工作。我是R新手,剛學過sapply,lapply,tapply函數,它似乎是平均函數在列中工作。

任何人都可以幫我解釋一下這些錯誤或警告信息是什麼意思,以及是否有一種方法可以使這些函數起作用?

使用lapply功能:

newdata<- subdata[, lapply(.SD, mean), by = c("Subject","Activity")] 

錯誤消息:

Error in `[.data.frame`(subdata, , lapply(.SD, mean), by = c("Subject", : 
unused argument (by = c("Subject", "Activity")) 

使用的功能:

newdata<-by(subdata, list(subdata$Subject, subdata$Activity), mean) 

我得到了警告消息:

Warning messages: 
1: In mean.default(data[x, , drop = FALSE], ...) : 
    argument is not numeric or logical: returning NA 

然後我plyr包ddply試圖

ddply(subdata, .(Subject, Activity), mean) 

我得到了相同的警告信息:

Warning messages: 
1: In mean.default(piece, ...) : argument is not numeric or logical: returning NA 0 

最後我用colwise(平均)功能,它似乎工作

newdata<-ddply(subdata, .(Subject, Activity), colwise(mean)) 
+0

與您的最後一個選項,嘗試'numcolwise(mean)'而不是'colwise(mean) – cdeterman 2014-11-20 20:38:41

回答

1

用數據集的代表性樣本來確定有些困難。讓我們創建一些數據來處理。

# Create some random demo data 
subdata <- data.frame(Subject = rep(seq(5), each=4), 
        Activity = rep(LETTERS[1:2], 10), v1=rnorm(20), v2=rnorm(20)) 

您的第一次嘗試我甚至不知道從哪裏開始。看起來你正試圖將你的數據框與列表的輸出進行子集化,這看起來很奇怪。你應該放棄這種嘗試。

您的by語句提供有關非數字數據的錯誤。這是因爲by功能不是那麼聰明。您只需要提供要分析的列,然後提供索引(即您的因子列)。

by(subdata[,-c(1,2)], list(subdata$Subject, subdata$Activity), function(x) colMeans(x)) 

Althought你可能想rbind此輸出並重新分配rownames對應團體。但是,爲此目的,最好僅使用aggregate來避免這種額外的計算。

aggregate(subdata[,-c(1,2)], list(subdata$Subject, subdata$Activity), mean) 

ddply陳述接近,但正如我上面建議你應該使用numcolwisenumeric列進行彙總。

library(plyr) 
# summarize over all numeric columns 
ddply(subdata, .(Subject, Activity), numcolwise(mean)) 
相關問題