2013-07-18 86 views
1

據我瞭解,在使用r時,使用lapply等函數而不是循環(在其他面向對象的語言中使用的頻率更高)會更加優雅。然而,當我試圖用命令執行簡單的任務時,我無法理解語法,並且犯了愚蠢的錯誤。例如:lapply的正確實現

我有一系列使用的loop.The以下虛擬dataframes充分說明數據從CSV文件加載dataframes的:

x <- c(0,10,11,12,13) 
y <- c(1,NA,NA,NA,NA) 
z <- c(2,20,21,22,23)  
a <- c(0,6,5,4,3) 
b <- c(1,7,8,9,10) 
c <- c(2,NA,NA,NA,NA) 
df1 <- data.frame(x,y,z) 
df2 <- data.frame(a,b,c) 

我首先生成數據幀的名單(data_names-我在加載csv文件時執行此操作),然後只需對列進行求和。我當然嘗試不起作用:

lapply(data_names, function(df) { 
counts <- colSums(!is.na(data_names)) 
}) 

我當然可以用列表(我從長遠來看,實現這一可能更好),但是從一個教學點,我想了解lapply更好。

非常感謝任何指針

+1

你想在你的函數中使用'df'而不是'data_names' ... – Justin

+0

+1爲可重複的例子 –

回答

2

這真的只是你的is.na使用,你不需要使用asignment操作<-函數內部的事實。 lapply返回一個列表,該列表是將FUN應用於輸入列表的每個元素的結果。您將lapply的輸出分配給一個變量,例如res <- lapply(.... , FUN)

我也不是很確定你最初是如何製作這個列表的,但下面應該足夠了。你也不需要一個匿名函數,在這種情況下,你可以使用名爲colSums還提供na.rm = TRUE參數來照顧龐先生NA S的數據:

lapply(list(df1, df2) , colSums , na.rm = TRUE) 
[[1]] 
x y z 
46 1 88 

[[2]] 
a b c 
18 35 2 

所以你可以看到這篇如下:

  • 對於列表中的每個DF:
  • 申請colSums的說法na.rm = TRUE

結果是一個列表,其中的每個元素都是將colSums應用於列表中的每個df的結果。

+0

啊優秀,它很高興看到打字可以進一步減少。感謝您的快速和雄辯的迴應。 – user1912925

+0

作爲一個附錄,我意識到我也可以使用我的原始版本:lapply(list列中值的數量。 – user1912925

+0

@ user1912925當然,是的 - 我沒有意識到這是你想要做的,但肯定會奏效。 –