一部の値が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次元の配列でなければなりません
誰か私に助けを与えることはできますか?
データ:
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)))]
dplyr
関数select_if()
を使用してこれを行う便利な方法を次に示します。 not(_!
_)、any()
、is.na()
を組み合わせます。これは、NA値を含まないすべての列を選択することと同じです。
_library(dplyr)
Itun %>%
select_if(~ !any(is.na(.)))
_
転置は2回使用できます。
newdf <- t(na.omit(t(df)))
data[,!apply(is.na(data), 2, any)]
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
を使用しました。
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))]