2017-03-22 5 views
1

私はNA値を持ついくつかの行を持つデータフレームを持っています。行がNA値であるかどうかを検出し、その行がNAであるかどうかを確認したい場合は、新しい列に書き出します。だから私はそれを解決するためにループのための標準的なダブルをしました。私の質問は、私は組み込みのR関数でこれをより効果的にすることができますか?私のコードは動作しますが、私は大きなデータフレームを持っている場合には、このループ内でコードをより効果的にするために、Rでinbuilt関数を使用するにはどうすればよいですか?

私のコード行うことが退屈になります。

for (j in 1:ncol(test)) { 
    for (i in 1:nrow(test)) { 
     if (is.na(test[i,j])) { 
      test$NA[i] <- "NA value" 
     } 
     else { 
      test$NA[i] <- "No NA value" 
     } 
    } 
} 
+1

'試験$ NA <有する - C( "いいえNA値"、 "NA値")[1 + as.integer((is.na(試験)適用1、any))] ' – jogo

答えて

2

NAが定義済みであるため、新しい列「NA」と命名

set.seed(42) 
test <- matrix(sample(c(3:12, NA), 20, repl=TRUE), 5) 
test <- as.data.frame(test) 
test$`NA` <- c("No NA value", "NA value")[1 + apply(is.na(test), 1, any)] 
test 
# V1 V2 V3 V4   NA 
# 1 NA 8 8 NA NA value 
# 2 NA 11 10 NA NA value 
# 3 6 4 NA 4 NA value 
# 4 12 10 5 8 No NA value 
# 5 10 10 8 9 No NA value 

は良いアイデアではありませんdでR

set.seed(42) 
test <- matrix(sample(c(3:12, NA), 20, repl=TRUE), 5) 
test <- cbind(test, apply(is.na(test), 1, any)) 
test 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] NA 8 8 NA 1 
# [2,] NA 11 10 NA 1 
# [3,] 6 4 NA 4 1 
# [4,] 12 10 5 8 0 
# [5,] 10 10 8 9 0 

またはあなたがリストにそれを置くことができます:

を新しい列にlablesを必要としない場合、あなたはまた、マトリックスとして testを保存することができます

test$NAindicator <- apply(is.na(test), 1, any) 

を使用することができますここで

+1

ありがとう!しかし、このラインは何をしていますか? [1 + apply 適用部分は取得しますが、+1ではありません。 – arezaie

+1

@arezaie 'as.integer(FALSE)'は0、 'as.integer(TRUE) 'は1です。Rのインデックスは1から始まります(ベクトル「c(「NA値なし」、「NA値」))を索引付けする。 – jogo

+0

ありがとうございました!ヘルプ/レッスンをお申し込みください! – arezaie

2

私が正しくあなたの二重ループを読めば、あなたは、データフレーム内の各行にラベルを付けたいのNAがその行に少なくとも1回発生する場合はNA valueと、それ以外の場合はNo NA valueとなります。私はR.

で特別な意味を持っている、 naとの衝突を避けるために、 navにご NA列の名前を変更し

df <- data.frame(v1=c(1,NA,2), v2=c(1,2,3), v3=c(1,2,NA)) 
df$nav[rowSums(is.na(df)) == 0] <- "No NA value" 
df$nav[rowSums(is.na(df)) > 0] <- "NA value" 
> df 
    v1 v2 v3   nav 
1 1 1 1 No NA value 
2 NA 2 2 NA value 
3 2 3 NA NA value 

注:あなたはrowSums()is.na()を含めて、これを行うためにここにいくつかの基本R機能を使用することができますあなたはapply()を使用することができます

+0

また、ifelse(rowSums(is.na(df))> 0、" NA値 "、" NA値なし ") –

+0

あなたは1つのステップでiitを実行できました – akrun

0

list(mat=test, NAindicator=apply(is.na(test), 1, any)) 
Reduce

library(data.table) 
setDT(test)[, NAV := c("No NA value", "NA value")[is.na(Reduce(`+`, .SD)) + 1]] 
test 
# V1 V2 V3 V4   NAV 
#1: NA 8 8 NA NA value 
#2: NA 11 10 NA NA value 
#3: 6 4 NA 4 NA value 
#4: 12 10 5 8 No NA value 
#5: 10 10 8 9 No NA value 
を持つ別のオプションです210

またはbase R

test$NAV <- paste(sub("\\d+", "No NA", do.call(pmax, test)), "value") 
test$NAV 
#[1] "NA value" "NA value" "NA value" "No NA value" "No NA value" 
関連する問題