例如,如果我有这样的数据框:
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)
但它不起作用。有人能告诉我该怎么做吗?
答案 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()