У меня есть таблица данных с столбцом с NA
s. Я хочу удалить строки, где этот столбец принимает определенное значение (что бывает ""
). Однако моя первая попытка привела к тому, что я потерял строки с помощью NA
:
> 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, который, похоже, работает по-другому, сохраняя 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>