2016-03-26 10 views
0

であれば、私はこの単純なデータフレームを持っている:コピー元先がn/

> dframe = data.frame(a=c(1,2,NA), b=c(11,NA,33)) 
> dframe 
    a b 
1 1 11 
2 2 NA 
3 NA 33 

私の目標は、bNAである場合にのみ、行ごとにbaをコピーすることですけど。だから私の最終的なデータは、このようになります。

> dframe 
    a b 
1 1 11 
2 2 2 
3 NA 33 

私はこれを試してみたが、それは私にエラーを与える:

> dframe[is.na(dframe$b), "b"] <- dframe[!is.na(dframe$a), "a"] 
Error in `[<-.data.frame`(`*tmp*`, is.na(dframe$b), "b", value = c(1, : 
    replacement has 2 rows, data has 1 
+0

あなたは投票した理由を説明してください。私はその質問を修正することができます。ありがとう。 –

答えて

3

我々はB」でNA値に基づいて論理インデックスを作成します'(' i1 ')。次に、 'a'の値を 'i1'に対応する 'b'に割り当てます。 OPのコードで

i1 <- is.na(dframe$b) 
dframe$b[i1] <- dframe$a[i1] 
dframe 
# a b 
#1 1 11 
#2 2 2 
#3 NA 33 

それが「B」のNA要素に「A」における非NA要素を置換されているように、<-のLHSとRHSのためのインデックス作成が異なっています。この問題は、エラーに記載されている要素数に問題があり、インデックスに基づくNAおよび非NA要素の数が同じであっても、対応する要素を置き換えることはありません。

sum(is.na(dframe$b)) 
#[1] 1 
sum(!is.na(dframe$a)) 
#[1] 2 
1
dframe$b=ifelse(is.na(dframe$b),dframe$a,dframe$b)) 
+0

なぜあなたはあなたの 'dplyr'答えを削除したのですか?なぜこれがダウン投票されたのですか? –

+0

それを行う最良の方法ではありませんでした:) – adaien

+0

あなたは答えの違いを説明することができますか?ありがとうございました –

関連する問題