2016-09-08 9 views
3

私は以下の例のような大きなデータフレームを持っています。条件を使用してデータフレーム内の既存の変数から新しい変数を作成します

  df <- data.frame(IND= seq(1:20), S = LETTERS[1:20], FA=c(0,0,133,0,2,2,2,0,0,4,4,4,6,6,0,0,0,4,2,8), 
MO = c(77,0,77,1,3,1,1,1,0,3,1,5,5,3,0,0,100,3,5,5) 
) 

FAとMOがINDと等しい場合、2つの新しい変数(SFAとSMO)を作成する必要があります。私は以下の出力が必要です

    out<- df <- data.frame(IND= seq(1:20), 
        S = LETTERS[1:20], 
        FA=c(0,0,133,0,2,2,2,0,0,4,4,4,6,6,0,0,0,4,2,8), 
        MO = c(77,0,77,1,3,1,1,1,0,3,1,5,5,3,0,0,100,3,5,5), 
           SFA=c(0,0,133,0,"B","B","B",0,0,"D","D","D","F","F",0,0,0,"D","B","H"), 
SMO=c(77,0,77,"A","C","A","A","A",0,"C","A","E","E","C",0,0,100,"C","E","E")) 

私は変数とマージしてみましたが、あまりうまくいきませんでした。 SどこFAMO)==​​から対応する値をピックアップして

おかげ

答えて

1

は、あなたがS[match(FA, IND)]としてSからのインデックスとサブセットを見つけるために(S[match(MO, IND)]を)match機能を使用し、その後に​​3210機能を使用することができます一致結果のNAを元のベクトルの値で塗りつぶします。

library(dplyr) 
df %>% mutate(SFA = coalesce(as.character(S[match(FA, IND)]), as.character(FA)), 
       SMO = coalesce(as.character(S[match(MO, IND)]), as.character(MO))) 

# IND S FA MO SFA SMO 
#1 1 A 0 77 0 77 
#2 2 B 0 0 0 0 
#3 3 C 133 77 133 77 
#4 4 D 0 1 0 A 
#5 5 E 2 3 B C 
#6 6 F 2 1 B A 
#7 7 G 2 1 B A 
#8 8 H 0 1 0 A 
# ... 
関連する問題