计算包含字符,日期和数字的data.frame中的空行

时间:2015-11-21 20:38:03

标签: r class na

嘿,

我有一个不同列的data.frame,有些是整数,有些是Date,有些是数字,有些甚至是字符。 数据框很大,除了一些标识符列,还包含数据列。 当然,数据列中的某些行是空的。 Empty是一行,如果是整数,则数字是NA,Date Columns是< cNA>和字符列为空(==“”)。

如何计算整个数据集的这些空子列?

foo <- data.frame(ID=c(1:4),
              character=c("a", "b","","d"), 
              integer=c(1, 2,NA,4),
              numeric=c(1.1, 2.2,NA,4.4),
              Date=as.Date(c("2015-11-10","2015-11-10","","2015-11-10")))
unlist(lapply(foo,class)) # correct classes of columns 

在此示例中,row3为空。是否有可能识别它? 我试图计算NAs:

foo$emptyrows<-rowSums(is.na(foo[,2:5]))

但空角色显然不是NA。 然后我试着替换空字符:

foo[foo==""]<-NA

但由于日期列,这会导致错误。 然后我试了一下:

foo2 <- data.frame(apply(foo,1:2,
                   function(x) if( x %in% c('',' ')) return(NA) else return(x)))

但是这会将所有列转换为因子。这对进一步的数据处理没有用。

unlist(lapply(foo2,class))

最后一步是这个问题! 谢谢你的帮助!

Der Elch von Oslo

2 个答案:

答案 0 :(得分:2)

sapply(foo,function(x) table(as.character(x) =="")["TRUE"])

这给你NA(如果列没有空字段,否则为空值。

与上述解决方案不同,您无需将空字符串转换为NA值。

答案 1 :(得分:1)

这是这样做的一个。在这种情况下,我们在比较中使用as.character

foo[sapply(foo, function(x) as.character(x)=="")] <- NA

然后你可以根据rowSums做一个过滤器,具体取决于允许多少个NA(这里我选择1,表示任何NA会踢出该行):

foo[rowSums(is.na(foo)) < 1, ]