2017-10-02 4 views
2

私は次の問題があります。私はCSVからデータをインポートします。インポートされたCSVファイルは、Kは私がKとMのサブセット内の値で乗算するリストを使用するようdplyrに新しい列を作成したいと思います1 000及びM 1 000 000を示し、このリストでサブセット化し、 "NA"値を認識しない

df <- data.frame(x=c(1,2,3,4,5), y=c("K","M",NA,NA,"K")) 

のように見えます

df %>% mutate(result=x * sul[y]) 

私の問題は、それがCSVからデータをインポートした結果がsul[y]で認識されていないと私はNAのいずれかを取得していること、しかしです:だからdplyrを使用して、X列

sul <- c("K"=1000, "M"=1000000, "NA"=1) 

またはNULLです。どのようにこの問題をエレガントな方法で解決するか考えていますか?その後、実行中のより良い方法はあります:

df$y[is.na(df&y)]<-1

どうもありがとう!

P.S. forループの代わりにリストによるサブセットが選択され、データの処理速度が向上します。

答えて

1

それは「その他」とNAを交換する方が良いし、その後

sul <- c(K=1000, M=1000000, Other=1) 
df %>% 
    mutate(y1 = replace(as.character(y), is.na(y), "Other"), 
      result = x*sul[y1]) %>% 
    select(-y1) 
# x y result 
#1 1 K 1000 
#2 2 M 2000000 
#3 3 <NA>  3 
#4 4 <NA>  4 
#5 5 K 5000 

を行うことができますsulの「NA」は、文字列ではなく本当のNAです。だから、私たちは「Y」の「NA」はうまく働いた"NA"

df %>% 
     mutate(result = x*sul[replace(as.character(y), is.na(y), "NA")]) 
+1

おかげで、へreplace、OPのポストから「スル」を使用している場合は! –

関連する問題