2014-11-04 56 views
0

我有一個包含4個數據幀的列表:製作由變量爲多個數據幀的NA計數的數據幀在一個列表中

> names(listofdf) [1] "q12014local" "q12014national" "q22014local" "q22014national"

所有數據幀具有相同的變量名。我想創建一個新的數據幀,通過變量和數據幀來統計NAs的數量。輸出的結果應該是這樣的:

   v1 v2 v3 v4 v5 v6 v7 
q12014local 328 278 1786 0  0  12 1 
q12014national 0 100 124 0  0  7  0 
q22014local  0 0  0  0  0  289 0 
q22014national 423 0  10 10 78 0  0  

這裏有一個重複的例子:

> df1 <- data.frame(v1 = c(1:5), v2 = c("apple", "pear", NA, "peaches", NA), v3 = c("sunday", "monday", NA, NA, NA))

> df2 <- data.frame(v1 = c(2, 7, NA, NA, "9"), v2 = c("plum", NA, "kiwi", NA, "jackfruit"), v3 = c(NA, NA, "saturday", NA, "wednesday"))

> df3 <- data.frame(v1 = c(12, NA, NA, NA, 8), v2 = c("pineapple", "guava", "lytchee", NA, NA), v3 = c("tuesday", "thursday", "friday", NA, "monday"))

> listofdf <- list(df1, df2, df3)

到目前爲止,我一直在使用lapply(listofdf, function(x) table(is.na(x[, 15])))來檢查列表中每個數據幀的NAs,這很麻煩!

+0

我想'listofdf'的名字將是'第一3'。順便說一句,你創建了'NA'作爲字符串。原始數據集中是這種情況嗎? – akrun 2014-11-04 19:57:15

+0

嘿,不,實驗室數據並不是字符串,它們是實際的數據。 – vagabond 2014-11-04 20:05:07

+0

在這種情況下,您可以使用第二個選項即。 'is.na(x)' – akrun 2014-11-04 20:05:48

回答

1

在示例中顯示,NAs是字符串。

names(listofdf) <- c("q12014local" , "q12014national", "q22014local") 
as.data.frame(t(sapply(listofdf, function(x) colSums(x=='NA')))) 
#    v1 v2 v3 
#q12014local  0 2 3 
#q12014national 2 2 3 
#q22014local  3 2 1 

對於真正NAs

t(sapply(listofdf, function(x) colSums(is.na(x)))) 
+0

你的回答是對的,但是有趣的事情正在發生!在由變量NA計數的矩陣中,變量名稱的計數正在互換。我看到v1下v3的數量。我對列表中的數據框進行了子集化,並再次檢查計數,並報告了正確的數字。但在列表中,變量名稱會更改。在將數據幀合併到列表之前,我是否必須對所有列進行位置匹配? – vagabond 2014-11-04 20:27:35

+0

@vagabond在提供的示例中,我沒有發現該異常。它是'sapply(listofdf,function(x)colSums(x =='NA'))''的輸出嗎?如果是這樣的話,你需要拿't'。 – akrun 2014-11-04 20:30:12

相關問題