【问题标题】:Change column values based on factors of other columns根据其他列的因子更改列值
【发布时间】:2017-04-02 02:17:45
【问题描述】:

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

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

profit     year  
10         2010  
10         2011  
10         2012 

我想根据year改变profit的值。对于 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)

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

【问题讨论】:

    标签: r


    【解决方案1】:

    对于这个特定示例,由于您的因子和年份都按 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 最有效的地方。但是,由于您在 cmets 中要求它,因此这是一种方法。我发现使用for() 循环和switch() 更容易。

    for(i in seq_len(nrow(df))) {
        df$profit[i] <- with(df, switch(as.character(year[i]),
            "2010" = 3 * profit[i],
            "2011" = 4 * profit[i],
            "2012" = 5 * profit[i]
        ))
    }
    

    【讨论】:

    • 非常感谢 Rich。但是如果我想使用 switch 函数来做一些更复杂的操作而不是简单的乘法呢?
    • @RichardZiyuWang - 除非你真的需要,否则我不会使用switch()。它不是矢量化的,这就是 R 最有效的地方。
    • @RichardZiyuWang - 我为switch() 添加了一个方法。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多