2014-11-04 63 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

相关问题