使用函数的输出逐行创建新列

时间:2016-02-01 02:18:12

标签: r function if-statement

我有一个数据框,其值为一列(CVT_revenue $ V4),范围从1到100.我想将一个函数应用于列中的每个值,并使用函数' s创建一个新列输出。例如,如果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语句,我可以看到它一遍又一遍地计算相同的值。这是打印结果的片段:

    [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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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的所有内容.Best,Derek