我有与变量相关的权重:
WeightVar1 <- .75
WeightVar2 <- .8
WeightVar3 <- .10
我想编写一个完成以下任务的函数:
Var1_New <- Var1 * WeightVar1
Var2_New <- Var2 * WeightVar2
Var3_New <- Var3 * WeightVar3
它看起来像这样
for (i in 1:3)
{
Var_New <- paste("Var",i,sep="") * paste("WeightVar",i,sep="")
Var_New <- paste("Var",i,"_New",sep="")
}
问题是R评估粘贴(&#34; WeightVar1&#34;,i,sep =&#34;&#34;)为&#34; WeightVar1&#34;而不是数值,.75。
我正在评估具有不同数量的变量和权重的数据集,因此不是单独评估它们,而是具有可以迭代到第i个的函数,这将节省时间并保持代码清洁。
答案 0 :(得分:0)
我会以不同的方式做事。首先,我要创建一个包含Var
和WeightVar
列的数据框:
df1 <- data.frame(Var = c(10, 20, 30),
WeightVar = c(0.75, 0.8, 0.1)
)
然后我写了这个函数:
make_new_var <- function(var, weightvar) {
var * weightvar
}
然后我将数据框的列传递给函数:
df1$NewVar <- make_new_var(df1$Var, df1$WeightVar)
df1
Var WeightVar NewVar
10 0.75 7.5
20 0.80 16.0
30 0.10 3.0
答案 1 :(得分:0)
由于许多R运算符(包括*
)被矢量化,你可以创建一个带变量的向量和一个带权重的向量,然后将它们相乘:
vars <- c(1, 2, 3)
weights <- c(10, 20, 30)
vw <- vars * weights
# > vw
# [1] 10 40 90
答案 2 :(得分:0)
如上所述,通过在我的paste命令中添加get(),它将变量视为值而不是字符块。感谢@AdamQuek的评论。
WeightVar1 <- .75
WeightVar2 <- .8
WeightVar3 <- .10
df<- data.frame(Var1 = 20
,Var2 = 30
,Var4 = 40)
for (i in 1:3)
{
df$Var_New <- df[i] * get(paste("WeightVar",i,sep=""))
names(df)[names(df) == "Var_New"] <- paste("Var",i,"_New",sep="")
}
当我不知道前面的变量/权重的数量时,这允许很多灵活。
谢谢!