【问题标题】:Create an arbitrary number of new columns using dplyr in R在 R 中使用 dplyr 创建任意数量的新列
【发布时间】:2017-08-07 11:02:07
【问题描述】:

我不确定标题是否用词好,但情况如下:

我有一个元数据数据集,其中可以包含任意数量的行,例如:

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

使用 Control_DF 中包含的数据,我想在我的主数据集上创建每个变量的新版本,我将变量乘以权重。因此,如果我的主要数据集如下所示:

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
  )

但是,我需要一种不对其进行硬编码的方法,并且要引用的变量数量是任意的。

谁能帮帮我?

【问题讨论】:

  • 不想硬编码的逻辑是什么?
  • 在我的示例中,我们有 V1-V3,但在应用中,我可能有 V1 - V10,或 V1 - V76 等。dplyr 的美妙之处在于简洁、可读的代码,但我'我努力将其扩展到问题。我可以做 lappy 什么的,但我认为它的效率会降低,而且它的可读性肯定会降低,这对我来说不太理想。
  • 如果我能以某种方式将 "weighted_V1 = V1 * w1,...,weighted_Vn = Vn * wn" 放入一个字符串,然后将其“粘贴并执行”到 mutate 函数中,那就太好了!

标签: r loops metadata dplyr


【解决方案1】:

在基础RlapplyMapcbind 中,您可以执行以下操作:

# 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多