目前在尝试更改数据框中的列时遇到一些困难。如下面的代码所示,我的目标是获取每个唯一colA
因子的平均背景值(背景值由布尔列标记)。使用它,我需要通过用计算出的平均背景减去value
来创建一个新列。
我尝试在for循环中使用ifelse,虽然我猜测for循环使用的是df$val_no_bg
的浅副本。有关更简单的方法进行背景扣除或解决这个范围问题的建议吗?
df <- data.frame(colA = c("A", "A", "A", "A", "B", "B", "B", "B"),
background = c(T, T, F, F, T, T, F, F),
value = c(10:17))
bg <- df[df$background, ]
bg_compiled <- aggregate(bg[, "value"], list(bg$colA), mean)
df$val_no_bg <- NA
for (i in nrow(bg_compiled$Group.1)) {
change <- which(df$colA == bg_compiled[i, "Group.1"])
df[change, "val_no_bg"] <- df[change, "value"] - bg_compiled[i, "x"]
}
答案 0 :(得分:2)
如果我理解正确,您可以使用dplyr
library(dplyr)
df %>%
group_by(background) %>%
mutate(val_no_bg = value - mean(value))
答案 1 :(得分:1)
在基数R中,您可以使用ave
计算一组平均值然后可以使用...
df$BGAv <- ave(df$value, df$colA, df$background, FUN=mean)
df
colA background value BGAv
1 A TRUE 10 10.5
2 A TRUE 11 10.5
3 A FALSE 12 12.5
4 A FALSE 13 12.5
5 B TRUE 14 14.5
6 B TRUE 15 14.5
7 B FALSE 16 16.5
8 B FALSE 17 16.5
如果你只想要colA
而不是background
的方法,那么省略第三个参数。
然后,您可以计算df$val_no_bg <- df$value - df$BGAv