2016-01-08 65 views
1
attach(airquality) 
s <- split(airquality, airquality$Month) 

如果我運行[R編程Lapply

lapply(s, colMeans(s[,c("Ozone","Solar.R","Wind")])) 

的錯誤出現。它說不正確的維數。

lapply(airquality, function(x)colMeans(x)) 

也顯示相同的錯誤。

lapply(s, function(x)colMeans(s[,"Ozone","Solar.R","Wind"]) 

此代碼工作得很好。

但是:

f<-function(x){ 
    colMeans(x[,c("Ozone","Solar.R","Wind")])} 

f(s) #error incorrect dimensions 

class(s) # class of s is list 

f(airquality) #gives mean of each column 

function()創建尺寸是多少?如果是那麼爲什麼lapplyairquality不起作用?

+0

能否請您檢查您的打開和關閉括號?一團糟。 –

+2

(1)'lapply(s,colMeans(s [,c(「Ozone」,「Solar.R」,「Wind」))不起作用,因爲它只是錯誤的,參見'lapply'。 (空格,函數(x)colMeans(x))'拋出一個錯誤,因爲你試圖在向量上計算'colMeans'('airquality'的列被強制轉換爲沒有尺寸的向量)(3)'function'沒有創建維度 - 在您的工作示例中,您的函數應用於列表's'中的元素,每個元素都是'data.frame',因此可以計算出'colMeans'。 – jbaums

+0

爲了澄清,'lapply'對'X'的每個元素應用一個函數,'s'的每個元素都是一個'data。frame',而'airquality'的每個元素都是一個向量(data.frame的元素就是它的列)。要使用'colMeans',你需要列。 – jbaums

回答

4

你的分割函數返回一個列表,但你正在操縱它像一個數組或數據框。

錯誤來自s[,c("Ozone","Solar.R","Wind")],由於它是列表,因此無法按此方式進行子集化。嘗試

s$`9`[,c("Ozone","Solar.R","Wind")] 

,你會看到這個作品,因爲

s$`9` 

是一個數據幀。

在您的第一次嘗試中,您不是在提供函數,而是在s上評估函數。由於您不能像上面那樣操作s,所以調用它上面的函數也會導致相同的錯誤,因爲函數的輸入有問題。

你的第二次嘗試失敗,因爲lapply會由一到colMeans功能,預計二維數組落得餵養每列一個(和你給它一個維數組)

的原因,最後一個電話的工作原理是,該功能

function(x)colMeans(x[,c("Ozone","Solar.R","Wind")]) 

可以在列表S的每個項目被稱爲每一個項目是一個數據幀。 lapply函數只是將其應用於該列表中的每個項目。

lapply(s,function(x)colMeans(x[,c("Ozone","Solar.R","Wind")])) 

是解決這個問題的正確方法。

的另一種方法是用按功能

by(airquality[,c("Ozone","Solar.R","Wind")],airquality$Month,colMeans) 
+4

也與此討論相關 - [lapply在數組或單個元素上工作?](http://stackoverflow.com/questions/27477768/lapply-works-over-an-array-or-a-single-element/ 27477951) – thelatemail