R表示更改数据框列中的循环范围

时间:2018-03-09 15:40:25

标签: r dataframe

目前在尝试更改数据框中的列时遇到一些困难。如下面的代码所示,我的目标是获取每个唯一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"]  
}

2 个答案:

答案 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