一般问题:
有没有办法使用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))
或类似的东西。
答案 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
。