【问题标题】:Creating a new column with a function's output, row by row逐行创建具有函数输出的新列
【发布时间】:2016-02-01 02:18:12
【问题描述】:

我有一个数据框,其中有一列值 (CVT_revenue$V4) 范围从 1 到 100。我想对列中的每个值应用一个函数,并使用函数的输出创建一个新列。例如,如果 CVT_revenue$V4 的第一行有 45,我希望函数在第一个 else if 语句中执行计算,然后将输出放入新列的第一行。

这是我尝试过的:

actualRevenues <- function(df, column){
  for (i in 1:nrow(df)){
    if (column[i] < 33){
      df$actualRevenue <- (column[i] * 22000 + 300000)
    } else if(column[i] > 32 & column[i] < 67){
      df$actualRevenue <- ((column[i] - 32) * 33000000 + 1000000)
    } else {
      df$actualRevenue <- ((column[i] - 66) * 9090909 + 100000000)
    }
      }
}
actualRevenues(CVT_revenue, CVT_revenue$V4)

自从开始处理这个问题以来,我了解到 mapply 可能是完成我想做的事情的最简单方法,但我不确定我的代码为什么不起作用。如果我在 else 语句之后放置一个 print 语句,我可以看到它一遍又一遍地计算相同的值。这是打印结果中的一个 sn-p:

    [1] 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08
  [10] 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08
  [19] 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08
  [28] 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08 5.95e+08

感谢您的帮助。

【问题讨论】:

    标签: r function if-statement


    【解决方案1】:

    有很多方法可以做到这一点,但最接近您开始的过程将引导您进入 ifelse。您想将 ifelse 用于此类矢量化问题,而不是 if(...) (这就是为什么您一遍又一遍地获得相同值的原因)。您不需要 for () 循环。这样的事情会起作用:

    df$actualRevenue <- ifelse(CVT_revenue$V4<  33, CVT_revenue$V4 * 22000 + 300000, 
                        ifelse(CVT_revenue$V4 > 32 & CVT_revenue$V4 < 67, (CVT_revenue$V4 - 32) * 33000000 + 1000000, 
                              (CVT_revenue$V4 - 66) * 9090909 + 100000000))
    

    这里,“else”条件成为最后评估的语句,即 V4 中大于 67 的所有内容。最好,Derek

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 2019-08-21
      • 1970-01-01
      • 2015-01-09
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多