嘿,
我有一个不同列的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
答案 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, ]