我有一个数据框,其值为一列(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
感谢您的帮助。
答案 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