【问题标题】:R Evaluates "paste" as character rather than valueR将“粘贴”评估为字符而不是值
【发布时间】:2017-04-19 05:33:42
【问题描述】:

我有与变量相关的权重:

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 将 paste("WeightVar1",i,sep="") 评估为 "WeightVar1" 而不是数值 .75。

我正在评估具有不同数量的变量和权重的数据集,因此与其单独评估它们,拥有一个可以迭代到第 i 个的函数将节省时间并保持代码整洁。

【问题讨论】:

  • get(paste0("WeightVar", i)) ?
  • 试试Map('*', mget(paste0("Var", 1:3)), mget(paste0("WeightVar", 1:3)))
  • paste("WeightVar1",i,sep="") 应该"WeightVar1",因为 i 是 1,而不是 0.75。同样,请参阅paste("hello", "world") 的输出,它与您的环境中存在的任何变量无关。
  • 谢谢! @AdamQuek, get() 也正是我所需要的!不敢相信我错过了。
  • @r2evans 是的,正确的是 WeightVar1,但我在代码前面设置了 WeightVar1

标签: r


【解决方案1】:

我会做不同的事情。首先,我将创建一个包含 VarWeightVar 列的数据框:

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

【讨论】:

  • 感谢@neilfws - 该解决方案完全有意义。但是,在这种情况下(尽管看起来很奇怪),我不想向量化我的权重变量。正如 adamqueck 指出的那样,get() 函数在这种情况下工作得很好。
  • 当然。但总的来说,我认为数据结构不应该决定解决方案是很重要的。如果您发现自己说“我必须这样做,因为这就是我的数据的外观”,这通常表明您应该对数据进行一些处理。
【解决方案2】:

由于许多 R 运算符(包括 *)是矢量化的,您可以创建一个带有变量的矢量和一个带有权重的矢量,然后将它们相乘:

vars <- c(1, 2, 3)
weights <- c(10, 20, 30)
vw <- vars * weights

# > vw
# [1] 10 40 90

【讨论】:

  • 感谢@kristofferwitherballing - 该解决方案完全有意义。但是,在这种情况下(尽管看起来很奇怪),我不想向量化我的权重变量。正如 adamqueck 指出的那样,get() 函数在这种情况下工作得很好。
【解决方案3】:

如前所述,通过在我的粘贴命令周围添加 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="")
}

当我预先不知道变量/权重的数量时,这可以提供很大的灵活性。

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多