すべてのNA値を持ついくつかの列を含むdata.frameがありますが、data.frameからそれらを削除するにはどうすればよいですか。
機能を使用できますか
na.omit(...)
追加の引数を指定しますか?
それを行う1つの方法:
df[, colSums(is.na(df)) != nrow(df)]
列のNAの数が行の数に等しい場合、完全にNAでなければなりません。
または同様に
df[colSums(!is.na(df)) > 0]
Dplyrソリューションは次のとおりです。
df %>% select_if(~sum(!is.na(.)) > 0)
のみALLNA
sの列を削除し、NA
sのある行の列を残したいようです。私はこれを行います(しかし、効率的なベクトル化されたsoutionがあると確信しています:
#set seed for reproducibility
set.seed <- 103
df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )
df
# id nas vals
# 1 1 NA NA
# 2 2 NA 2
# 3 3 NA 1
# 4 4 NA 2
# 5 5 NA 2
# 6 6 NA 3
# 7 7 NA 2
# 8 8 NA 3
# 9 9 NA 3
# 10 10 NA 2
#Use this command to remove columns that are entirely NA values, it will elave columns where only some vlaues are NA
df[ , ! apply( df , 2 , function(x) all(is.na(x)) ) ]
# id vals
# 1 1 NA
# 2 2 2
# 3 3 1
# 4 4 2
# 5 5 2
# 6 6 3
# 7 7 2
# 8 8 3
# 9 9 3
# 10 10 2
NA
の値を持つ列を削除したい場合は、上記のall
コマンドをany
に変更するだけです。
直感的なスクリプト:dplyr::select_if(~!all(is.na(.)))
。文字通り、すべての要素が欠落していない列のみを保持します。 (すべての要素が欠落している列を削除します)。
> df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )
> df %>% glimpse()
Observations: 10
Variables: 3
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
$ nas <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ vals <int> NA, 1, 1, NA, 1, 1, 1, 2, 3, NA
> df %>% select_if(~!all(is.na(.)))
id vals
1 1 NA
2 2 1
3 3 1
4 4 NA
5 5 1
6 6 1
7 7 1
8 8 2
9 9 3
10 10 NA
Filter
の別のオプション
Filter(function(x) !all(is.na(x)), df)
注:@Simon O'Hanlonの投稿からのデータ。