【问题标题】:R: Conditionally calculate percent values from different columns/idsR:有条件地计算来自不同列/ID的百分比值
【发布时间】:2015-02-26 19:35:15
【问题描述】:

我有一个数据框,我想使用唯一代码对不同 ID 内的百分比值进行有条件的减法/加法。

具体来说,我想将 10% 的代码 1% 值添加到代码 3% 的值,并从代码 1 中减去 10% 的代码 1% 值。其余代码保持不变。理想情况下,结果会添加到新列中。

我的问题与这两个相似,但有一些重要区别。 R ddply with multiple variablesEasiest way to subtract associated with one factor level from values associated with all other factor levels

我认为最好的方法是 plyr,我已经有了,但是它不起作用。

df <- data.frame(id=c(rep("113316", 4), rep("113317", 3)), code=c(1,3,4,5,1,3,4), percent=c(0.2571, 0.7257, 0.0114, 0.0057, 0.9596, 0.0058, 0.0857))
df.2 <- ddply(df, .(id, code), transform, percent=(percent*.90[code==1]+percent[code==3] | percent=percent*.90[code==1]-percent[code==1]))

输出如下所示:

id     code percent new
113316 1    0.2571  0.23139
113316 3    0.7257  0.75141
113316 4    0.0114  0.01140
113316 5    0.0057  0.00570
113317 1    0.9596  0.86364
113317 3    0.0058  0.10176
113317 4    0.0857  0.08570

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您可能希望分两步执行此操作,如下所示:

    #initialize the new variable
    df$new <- df$percent
    # Add 10% from code == 1 to  code == 3
    df$new[df$code == 3] <- df$new[df$code == 3] + 0.1 * df$percent[df$code == 1]
    # sutbtract off 10% from code 1 where code == 1
    df$new[df$code == 1] <- 0.9 *df$new[df$code == 1] 
    

    请注意,这里假设 sum(df$code == 1) == sum(df$code == 3),否则会有一些回收,这可能会导致您稍后在计算中难以检测到错误。这也假设数据按id 排序。

    对 data.frame 结构做出较少假设的 dplyr 解决方案将 group_by id 和 mutate 使用如下窗口函数:

    fun  <- function(id,percent){
        if(all(c(1,3) %in% id)){
            percent[id == 3] <- percent[id == 3] + 0.1*percent[id == 1]
            percent[id == 1] <- 0.9*percent[id == 1] 
        }
        percent
    }
    
    library(dplyr)
    df %>% 
        group_by(id) %>% 
        mutate(new = fun(id,percent))
    

    【讨论】:

    • new 中的第二个值与 OP 的预期输出不同。可能是 OP 帖子中的错字
    • 嗨,很抱歉。我已经编辑了我的答案。第一部分效果很好,您的假设完全正确 - 我希望将这些添加到 1。
    • 第二部分似乎没有任何改变,但也许我需要编辑它。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多