使用dplyr来改变指定组的值的问题

时间:2016-07-09 16:54:40

标签: r dplyr

我已经获得了一些值,这些值被标记为群组的一部分。

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

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

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

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)

我可以像这样调整它们:

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

但不!这不起作用?

使用

df %>% rowwise() %>% filter(group %in% groups_to_adjust)

表示%in%运算符实际上根本没有选择任何行。

我该如何执行此操作?

1 个答案:

答案 0 :(得分:1)

我们需要从“groups_to_adjust”数据集中提取“组”。

r1 <- df  %>% 
        filter(group %in% groups_to_adjust$group)

因为它是带有两列的'data.frame'

str(groups_to_adjust)
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':       16 obs. of  2 variables:
# $ group: num  12 13 23 35 40 42 46 53 54 56 ...
# $ diff : num  4.09 4.66 4.52 4.3 4.33 ...

我们可以使用filter

以紧凑的方式完成此操作
df1 <- copy(df)
r2 <- df %>%
         group_by(group) %>%
         filter((max(val)- min(val)) > 4)
all.equal(r1, r2, check.attributes=FALSE)
#[1] TRUE