web-dev-qa-db-ja.com

一部の値がNAであるデータフレームから列を削除する

一部の値がNAであるデータフレームがあります。これらの列を削除したいと思います。

私のdata.frameはこのようになります

    v1   v2 
1    1   NA 
2    1    1 
3    2    2 
4    1    1 
5    2    2 
6    1   NA

列平均を推定し、列平均!= NAを選択しようとしました。私はこの声明を試しましたが、うまくいきません。

data=subset(Itun, select=c(is.na(colMeans(Itun))))

エラーが発生しました

エラー: 'x'は少なくとも2次元の配列でなければなりません

誰か私に助けを与えることはできますか?

23
TTT

データ:

Itun <- data.frame(v1 = c(1,1,2,1,2,1), v2 = c(NA, 1, 2, 1, 2, NA)) 

これにより、少なくとも1つのNAを含むすべての列が削除されます。

Itun[ , colSums(is.na(Itun)) == 0]

別の方法はapplyを使用することです:

Itun[ , apply(Itun, 2, function(x) !any(is.na(x)))]
45
Sven Hohenstein

dplyr関数select_if()を使用してこれを行う便利な方法を次に示します。 not(_!_)、any()is.na()を組み合わせます。これは、NA値を含まないすべての列を選択することと同じです。

_library(dplyr)
Itun %>%
    select_if(~ !any(is.na(.)))
_
21
Matt Dancho

転置は2回使用できます。

newdf <- t(na.omit(t(df)))
10
Scott Worland
data[,!apply(is.na(data), 2, any)]
6
Backlin

apply回答に関連する基本Rメソッドは

_Itun[!unlist(vapply(Itun, anyNA, logical(1)))]
  v1
1  1
2  1
3  2
4  1
5  2
6  1
_

ここで、vapplyはリストを操作しているときに使用され、applyはオブジェクトを行列に強制しません。また、出力が長さ1の論理ベクトルになることがわかっているので、これをvapplyに供給して、速度を少し上げることができます。同じ理由から、any(is.na())ではなくanyNAを使用しました。

1
lmo

dplyrパッケージのもう1つの代替案は、Filter関数を使用することです。

Filter(function(x) !any(is.na(x)), Itun)

data.tableはもう少し面倒です

setDT(Itun)[,.SD,.SDcols=setdiff((1:ncol(Itun)),
                                which(colSums(is.na(Itun))>0))]
1
Oriol Prat