根据其他列的因素更改列值

时间:2017-04-02 02:17:45

标签: r

例如,如果我有这样的数据框:

df <- data.frame(profit=c(10,10,10), year=c(2010,2011,2012))

profit     year  
10         2010  
10         2011  
10         2012 

我想根据profit更改year的值。对于2010年,我将利润乘以3,对于2011年,将利润乘以4,对于2012年,乘以5,这应该是这样的结果:

profit     year  
30         2010  
40         2011  
50         2012 

我该如何处理?我试过了:

inflationtransform <- function(k,v) {
    switch(k, 
        2010,v<-v*3,
        2011,v<-v*4,
        2012,v<-v*5,
    )
}

df$profit <- sapply(df$year,df$profit,inflationtransform)

但它不起作用。有人能告诉我该怎么做吗?

1 个答案:

答案 0 :(得分:2)

对于此特定示例,由于您的因子和年份都是有序且递增1,您可以从year列中减去2007并将其乘以profit

transform(df, profit = profit * (year - 2007))
#   profit year
# 1     30 2010
# 2     40 2011
# 3     50 2012 

否则,您可以使用查找向量。这将涵盖所有情况。

lookup <- c("2010" = 3, "2011" = 4, "2012" = 5)
transform(df, profit = profit * lookup[as.character(year)])
#   profit year
# 1     30 2010
# 2     40 2011
# 3     50 2012

除非你真的需要,否则我不会使用switch()。它没有矢量化,这就是R最有效的地方。但是,由于您在评论中提出要求,这是一种方式。我发现使用for()的{​​{1}}循环更容易。

switch()