2017-06-13 27 views
0

私は2つのデータフレームを持っています。データフレームの値の置き換え - R

ワン:

>df1   a  b  c  d 
    W_1  NA NA NA NA 
    W_2  2  2  2  4 
    W_3  4  2  2  4 
    W_4  NA NA NA NA 

第二:

>df2  a  b  c  d 
    W_1 TRUE FALSE FALSE FALSE 
    W_2 FALSE TRUE FALSE TRUE 
    W_3 TRUE FALSE FALSE TRUE 
    W_4 FALSE TRUE FALSE TRUE 

私は2番目のデータフレーム値でFALSEあるNA、と最初のデータフレーム内の場所を交換したいです。

出力は次のようになります。

  a  b  c  d 
W_1  NA NA NA NA 
W_2  NA  2 NA  4 
W_3  4 NA NA  4 
W_4  NA NA NA NA 

これは私のコードです:

for (i in nrow(df2)) { 
    for (j in 1:ncol(df2)) { 
    a = df2[i,j] 
    if (a == FALSE) { 
     df1[i,j] = NA 
    } 
    } 
} 

私は何らかのエラーが返され得ることはありませんが、コードはどちらか動作しません。最初のデータフレームは変更されません。何が間違っているかもしれないという提案はありますか?

ありがとうございました。

+2

'DF1の[!DF2]に変換せずに動作します< - NA'はどうすればいいのですか – Cath

+3

'is.na(df1)< - !df2' – Frank

+1

@quant' FALSE == "FALSE"と "FALSE" == "FALSE"を比較します。強制は彼らを救う。 – Frank

答えて

6

df2試合の行/ colsのdf1の正確なものならば、あなたはちょうどあなたがdf1に欲しいものを置き換えるためにdf2で論理値を使用することができます。

df1[!df2] <- NA 

@Frankの方法も同様に動作します:

is.na(df1) <- !df2 

例:

df1 <- data.frame(matrix(1:16, ncol=4)) 
set.seed(123) 
df2 <- data.frame(matrix(sample(c(TRUE, FALSE), 16, replace=TRUE), ncol=4)) 
df1[!df2] <- NA # or is.na(df1) <- !df2 
df1 
# X1 X2 X3 X4 
#1 1 NA NA NA 
#2 NA 6 10 NA 
#3 3 NA NA 15 
#4 NA NA 12 NA 
+0

それは私に「FUN(左)のエラー:無効な引数型」というエラーを表示します、それはどういう意味ですか? –

+0

@ bass.bz 'dput'を使ってデータ構造を教えてもらえますか?そうでなければ何が起こっているのか分かりません – Cath

2

我々はdata.table

library(data.table) 
setDT(df1) 
for(j in seq_along(df1)){ 
set(df1, i = which(!df2[[j]]), j=j, value = NA) 
} 

df1 
# a b c d 
#1: NA NA NA NA 
#2: NA 2 NA 4 
#3: 4 NA NA 4 
#4: NA NA NA NA 

から効率的setでこれを行うことができます@Frankはコメントで述べたように、それはまた、data.table

for(j in seq_along(df1)){ 
    set(df1, i = which(!df2[[j]]), j=j, value = NA) 
    } 
df1 
#  a b c d 
#W_1 NA NA NA NA 
#W_2 NA 2 NA 4 
#W_3 4 NA NA 4 
#W_4 NA NA NA NA 
+0

両方のデータフレームで行数が同じ場合にのみ動作しますか? –

+0

@ bass.bzはい、あなたの例に基づいています。同じでない場合は、値を置き換えるロジックについては不明です – akrun

関連する問題