R:使用dplyr

时间:2019-05-24 06:56:27

标签: r dplyr

下面是我要转换的数据框(玩具示例),以便组变为1、1、2、2、3、3、3。

  group       y
  C           -1.55461160
  C           0.34945015
  A           0.57210825
  A           -0.88019528
  H           0.03307085
  H           1.13494754
  H          -1.65146164

我当前的解决方案是计算组数和每个组的记录数,并使用这两部分来重新创建组变量,即

ngroups   <- length(unique(df$group))
npergroup <- aggregate(x = rep(1, nrow(df)), by = list(df$group), FUN = sum)$x

df <- df %>%
  mutate(group = rep(1:ngroups, npergroup))

出于优雅的考虑,您是否具有完整的 dplyr 解决方案?

2 个答案:

答案 0 :(得分:4)

一种可能是:

df %>%
 mutate(group2 = cumsum(!duplicated(group))) 

  group           y group2
1     C -1.55461160      1
2     C  0.34945015      1
3     A  0.57210825      2
4     A -0.88019528      2
5     H  0.03307085      3
6     H  1.13494754      3
7     H -1.65146164      3

或者您可以使用类似rleid()的函数:

df %>%
 mutate(group2 = with(rle(group), rep(seq_along(lengths), lengths)))

如果您只想为“组”分配唯一的ID:

df %>%
 mutate(group2 = group_indices(., group))

  group           y group2
1     C -1.55461160      2
2     C  0.34945015      2
3     A  0.57210825      1
4     A -0.88019528      1
5     H  0.03307085      3
6     H  1.13494754      3
7     H -1.65146164      3

答案 1 :(得分:1)

这不是dplyr,但还不错。

library(data.table)
library(dplyr)

df%>%
  mutate(group = rleid(group))

  group           y
1     1 -1.55461160
2     1  0.34945015
3     2  0.57210825
4     2 -0.88019528
5     3  0.03307085
6     3  1.13494754
7     3 -1.65146164