35

一部の値が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次元の配列である必要があります

誰か助けてもらえますか?

4

7 に答える 7

62

データ:

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)))]
于 2012-09-17T07:25:54.483 に答える
33

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

library(dplyr)
Itun %>%
    select_if(~ !any(is.na(.)))
于 2017-10-27T16:48:34.910 に答える
11

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

newdf <- t(na.omit(t(df)))
于 2016-04-01T19:13:16.783 に答える
9

または、select(where(~FUNCTION))次を使用することもできます。

library(dplyr)

(df <- data.frame(x = letters[1:5], y = NA, z = c(1:4, NA)))
#>   x  y  z
#> 1 a NA  1
#> 2 b NA  2
#> 3 c NA  3
#> 4 d NA  4
#> 5 e NA NA

# Remove columns where all values are NA
df %>% 
  select(where(~!all(is.na(.))))
#>   x  z
#> 1 a  1
#> 2 b  2
#> 3 c  3
#> 4 d  4
#> 5 e NA
  
# Remove columns with at least one NA  
df %>% 
  select(where(~!any(is.na(.))))
#>   x
#> 1 a
#> 2 b
#> 3 c
#> 4 d
#> 5 e
于 2020-09-04T17:28:00.403 に答える
6
data[,!apply(is.na(data), 2, any)]
于 2012-09-17T07:27:49.690 に答える
2

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、速度を少し上げることができます。同じ理由で、のanyNA代わりにを使用しましたany(is.na())

于 2017-02-03T19:30:30.867 に答える
2

パッケージの別の代替手段は、関数dplyrを利用することです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))]
于 2019-07-15T15:44:50.860 に答える