R:有条件地计算来自不同 columns/ids 的百分比值

R: Conditionally calculate percent values from different columns/ids

我有一个数据框,我想使用唯一代码在不同 ID 中执行有条件的 subtraction/addition 百分比值。

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

我的问题与这两个类似,但有一些重要的区别。 R ddply with multiple variables and Easiest 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

您可能希望分两步完成此操作,如:

#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.

排序

一个 dplyr 解决方案对你的 data.frame 的结构做出更少的假设将 group_by id 和 mutate 使用 window 函数,如下所示:

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))