简化所选组的dplyr突变

时间:2016-07-09 17:24:16

标签: r dplyr

一般问题:

有没有办法使用dplyr识别感兴趣的组并仅改变那些组?

所述问题的实例化

想象一下,我有一些值,它们被标记为群组的一部分。

在某些群体中,价值观的传播太大了。

我想调整这些组的较低值。

我可以像这样生成一些合成数据:

callback

我可以像这样识别感兴趣的群体:

groups <- floor(runif(1000,1,100))
values <- rnorm(1000,0,1)
df     <- data.frame(group=groups,val=values)

然后我可以像这样调整这些组:

groups_to_adjust <- df %>% group_by(group) %>% summarise(diff=max(val)-min(val)) %>% filter(diff>4) %>% select(group)

理想情况下,所有这些都可以在单个dplyr链中完成。有没有一种干净的方法来实现这一目标?我想:

df <- df %>% mutate(val=ifelse(group %in% groups_to_adjust$group, ifelse(val<0,val+4,val), val))

或类似的东西。

1 个答案:

答案 0 :(得分:0)

没有测试代码,但我认为这可以做你想要的:

df %>% group_by(group) %>% 
       mutate(val = ifelse(max(val) - min(val) > 4 & val < 0, val + 4, val))

一个小数据框的测试用例:

df
   group   val
1      1  0.00
2      1 -1.56
3      1  0.70
4      1  0.30
5      2 -1.66
6      2 -0.49
7      2 -0.36
8      2  1.67
9      3  0.94
10     3  1.62
11     3  0.89
12     3 -0.53

df %>% group_by(group) %>% 
       mutate(val = ifelse(max(val) - min(val) > 3 & val < 0, val + 4, val))

Source: local data frame [12 x 2]
Groups: group [3]

   group   val
   (int) (dbl)
1      1  0.00
2      1 -1.56
3      1  0.70
4      1  0.30
5      2  2.34
6      2  3.51
7      2  3.64
8      2  1.67
9      3  0.94
10     3  1.62
11     3  0.89
12     3 -0.53

仅替换第二组中的负值,因为其他两组差异小于3