【发布时间】:2013-04-19 18:14:52
【问题描述】:
我有一个 data.table,其中有一列包含 NAs。我想删除该列具有特定值的行(恰好是"")。但是,我的第一次尝试也导致我丢失了 NAs 的行:
> a = c(1,"",NA)
> x <- data.table(a);x
a
1: 1
2:
3: NA
> y <- x[a!=""];y
a
1: 1
看了?`!=`后,我发现了一个可以工作的单行,但是很痛苦:
> z <- x[!sapply(a,function(x)identical(x,""))]; z
a
1: 1
2: NA
我想知道是否有更好的方法来做到这一点?此外,我认为没有很好的方法可以将其扩展到排除多个非NA 值。这是一个不好的方法:
> drop_these <- function(these,where){
+ argh <- !sapply(where,
+ function(x)unlist(lapply(as.list(these),function(this)identical(x,this)))
+ )
+ if (is.matrix(argh)){argh <- apply(argh,2,all)}
+ return(argh)
+ }
> x[drop_these("",a)]
a
1: 1
2: NA
> x[drop_these(c(1,""),a)]
a
1: NA
我查看了?J 并尝试了一个 data.frame,它似乎工作方式不同,在子集时保持NAs:
> w <- data.frame(a,stringsAsFactors=F); w
a
1 1
2
3 <NA>
> d <- w[a!="",,drop=F]; d
a
1 1
NA <NA>
【问题讨论】:
-
好的,我刚刚找到了一个更好的方法,
x[is.na(a)|a!=""],但这也很麻烦,我怀疑我处理错了。 -
我的实质性问题已由前两个答案解决。我仍然想知道这里是否有与标准data.frames不同的行为的原因。似乎 Matthew 将其设计为仅显示评估为 True 的行,而 data.frames 显示评估为 True 或(逻辑)NA 的行...?
-
顺便说一句,注意到你写了
x <- data.table(a);x。不错的小东西,你可以写(x <- data.table(a)),当命令os结束时,r会打印出x。 -
@Frank 你更喜欢
data.frame打印NA行的方式??我一直认为输出很糟糕! -
@haki:哦,对了;忘记了。谢谢。
标签: r data.table