【问题标题】:R loop change variable namesR循环更改变量名称
【发布时间】:2019-01-31 06:11:01
【问题描述】:

查看了有关此主题的几篇帖子,但仍然无法弄清楚。我想我只是问一下:

我写了一个for循环:

for (i in 0:5) {
     est16_y2016$pov50_[i] <- est16_y2016$pop[i]*est16_y2016$ITPR_0.5
               }

实现与以下代码相同的结果:

 est16_y2016$pov50_0 <- est16_y2016$pop0 * est16_y2016$ITPR_0.5
 est16_y2016$pov50_1 <- est16_y2016$pop1 * est16_y2016$ITPR_0.5
 est16_y2016$pov50_2 <- est16_y2016$pop2 * est16_y2016$ITPR_0.5 
 est16_y2016$pov50_3 <- est16_y2016$pop3 * est16_y2016$ITPR_0.5 
 est16_y2016$pov50_4 <- est16_y2016$pop4 * est16_y2016$ITPR_0.5 
 est16_y2016$pov50_5 <- est16_y2016$pop5 * est16_y2016$ITPR_0.5 

但循环不起作用。没有错误消息,也没有生成新变量。帮助!谢谢。

【问题讨论】:

  • 试试paste0('est16_y2016$pov50_',i)
  • 看起来像XY problem。你想做什么?请提供更多背景信息。
  • @JohnColeman 我正在尝试生成一些新变量(您可能从我的代码中可以看出),并且我想使用 for-loop 使代码更紧凑。
  • @A.Suliman 我在哪里把它放在循环中?谢谢。
  • @EricWang 抱歉,这应该对for (i in 0:5) est16_y2016[,paste0('pov50_',i)] &lt;- est16_y2016[,paste0('pop',i)]*est16_y2016$ITPR_0.5 }有帮助@

标签: r loops for-loop


【解决方案1】:

虽然data$column_name 的构造在交互式 R 会话中非常方便,但在编程时可能会导致一些问题。 @A.Suliman 的评论提出了解决这些问题的方法,这是另一种方法。

for(i in 0:5){
    target <- paste("pov50", i, sep = "_")
    pop <- paste0("pop",i)
    est16_y2016[[target]] <- est16_y2016[[pop]]*est16_y2016[["ITPR_0.5"]]
}

【讨论】:

    【解决方案2】:

    如果没有可重复的示例,很难回答您的问题,但我会试一试。 est16_y2016$pop[i] 将为您提供 est16_y2016$pop 的 ith 元素(可能甚至不存在。您想要的是 est16_y2016[paste0("pop",i)] 所以你的代码应该是这样的:

    for (i in 0:5) 
        {
         est16_y2016[[paste0("pov50_",i)]] <- est16_y2016[[paste0("pop",i)]]*est16_y2016$ITPR_0.5
         }
    

    (已编辑)

    【讨论】:

    • paste0("pov50_",i) 执行相同操作。这看起来像一个 df,使用双 [[ 就像在 est16_y2016[[paste0("pop",i)]] 中一样。您应该编辑答案。
    • GordonShumway,你的任务错了。 OP 想要名为 pov50_0pov50_1 等的列。使用 paste0("pop",i) 的建议适用于 lhs,而不是 rhs。
    • 请参阅@A。上面是苏利曼的回答。并非所有问题都需要可重复的示例。
    • @EricWang 是的,他们有,看看 cmets 的数量,有一个可重复的例子,一开始会更清楚。
    • @RuiBarradas 他们呢?我们已经有了解决办法。事实上,A.Suliman 的第一条评论就是一个解决方案。有趣的是,这么多不知道答案的人一直在评论。
    【解决方案3】:

    用paste()创建一个新的变量名很容易,问题是如何使用对应的变量而不是变量名。

      for (i in 0:5){ 
        # Create new variable names
        pov.name = paste0("est16_y2016$pov50_",i)
        pop.name = paste0("est16_y2016$pop",i)
    
        assign(pov.name,eval(parse(text = pop.name))*est16_y2016$ITPR_0.5)
        }
    

    在这段代码中,

    eval(parse(text = pop.name) 使用字符串 "pop.name" 作为变量名

    assign(pov.name,value1)创建一个名为 pov.name 的变量并将 value1 赋给 pov.name

    这样,您可以在不使用数据框的情况下获得六个新变量。

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2014-04-15
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多