sを持つ列を持つdata.tableがありますNA
。その列が特定の値を取る行を削除したい (たまたま""
)。ただし、私の最初の試みでは、NA
s でも行が失われました。
> 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
サブセット化するときに sを保持して、動作が異なるように見える data.frameを調べて?J
試してみました。NA
> w <- data.frame(a,stringsAsFactors=F); w
a
1 1
2
3 <NA>
> d <- w[a!="",,drop=F]; d
a
1 1
NA <NA>