2017-08-07 12 views
1

でdplyrを使用して新しい列の任意の数を作成します。私はタイトルがうまく言葉で表現されるかどうかわからないんだけど、ここでの状況であるR

私は、行の任意の数を持つことができるメタデータセットを、持っていますこれで、例えば:Control_DFに含まれるデータを使用して

Control_DF <- cbind.data.frame(
    Scenario = c("A","B","C") 
    ,Variable = c("V1","V2","V3") 
    ,Weight = c("w1","w2","w3") 
) 

は、私は重量で変数を掛け、私のメインのデータセット、上の各変数の新しいバージョンを作成したいです。私のメインのデータセットは、次のようになりますのであれば:

Main_Data <- cbind.data.frame(
    V1 = c(1,2,3,4) 
    ,V2 = c(2,3,4,5) 
    ,V2 = c(3,4,5,6) 
    ,w1 = c(0.1,0.5,1,0.8) 
    ,w2 = c(0.2,1,0.3,0.6) 
    ,w2 = c(0.3,0.7,0.1,0.2) 
) 

その後、オープンコードでは、私がやりたいことは次のようになります。

New_Data <- Main_Data %>% 
    mutate(
    weighted_V1 = V1 * w1 
    ,weighted_V2 = V2 * w2 
    ,weighted_V3 = V3 * w3 
) 

しかし、私はハードこれをコーディングしない方法を必要とし、参照される変数の数は任意である。

誰でも手伝ってもらえますか?

次のようにあなたができる
+0

は、論理何ですか? – mtoto

+0

私の例ではV1-V3がありますが、このアプリケーションではV1 - V10、V1 - V76などがあります。dplyrの美しさは簡潔で読みやすいコードですが、これを拡張するのに苦労しています問題。私はリボンか何かをすることができますが、それはあまり効率的ではないと思うし、それは確かに読みにくいので、あまり望ましくないです。 – TomFromWales

+0

どういうわけか、 "weighted_V1 = V1 * w1、...、weighted_Vn = Vn * wn"を文字列に入れて、これを "paste and exectue"してこれをmutate関数に入れると良いでしょう! – TomFromWales

答えて

0
lapplyとベース R

Mapcbind

# with Control_DF create a list with pairs of <varName,wgt> 

controlVarList = lapply(Control_DF$Scenario,function(x) 

as.vector(as.matrix(Control_DF[Control_DF$Scenario==x,c("Variable","Weight")])) 

) 

controlVarList 
#[[1]] 
#[1] "V1" "w1" 
# 
#[[2]] 
#[1] "V2" "w2" 
# 
#[[3]] 
#[1] "V3" "w3" 


# A custom function for multiplication of both columns 

fn_weightedVars = function(x) { 

# x = c("V1","w1"); hence x[1] = "V1",x[2] = "w2" 
# reference these columns in Main_Data and do scaling 
wgtedCol = matrix(Main_Data[,x[1]] * Main_Data[,x[2]],ncol=1) 

#rename as required 
colnames(wgtedCol)= paste0("weighted_",x[1]) 

#return var 
wgtedCol 


} 


#call function on each each list element 

scaledList = Map(fn_weightedVars ,controlVarList) 

出力:あなたはハードコードにしたくない場合は

scaledDF = do.call(cbind,scaledList) 

#combine datasets 
New_Data = data.frame(Main_Data,scaledDF) 
New_Data 
# V1 V2 V3 w1 w2 w3 weighted_V1 weighted_V2 weighted_V3 
#1 1 2 3 0.1 0.2 0.3   0.1   0.4   0.9 
#2 2 3 4 0.5 1.0 0.7   1.0   3.0   2.8 
#3 3 4 5 1.0 0.3 0.1   3.0   1.2   0.5 
#4 4 5 6 0.8 0.6 0.2   3.2   3.0   1.2 
関連する問題