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))
我有一个数据框,我想使用唯一代码在不同 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))