R中行的有序分组

R中行的有序分组

我想创建一个新列,按顺序标记行组。原始数据:

> dt = data.table(index=(1:10), group = c("apple","apple","orange","orange","orange","orange","apple","apple","orange","apple"))
> dt
    index  group
 1:     1  apple
 2:     2  apple
 3:     3 orange
 4:     4 orange
 5:     5 orange
 6:     6 orange
 7:     7  apple
 8:     8  apple
 9:     9 orange
10:    10  apple

期望的输出:
    index  group id
 1:     1  apple  1
 2:     2  apple  1
 3:     3 orange  1
 4:     4 orange  1
 5:     5 orange  1
 6:     6 orange  1
 7:     7  apple  2
 8:     8  apple  2
 9:     9 orange  2
10:    10  apple  3
dplyr 尝试:
dt %>% group_by(group) %>% mutate( id= row_number())
# A tibble: 10 x 3
# Groups:   group [2]
   index group     id
   <int> <chr>  <int>
 1     1 apple      1
 2     2 apple      2
 3     3 orange     1
 4     4 orange     2
 5     5 orange     3
 6     6 orange     4
 7     7 apple      3
 8     8 apple      4
 9     9 orange     5
10    10 apple      5

如何编辑它以将第一组苹果设为 1,然后将第一组橙子设为 1,然后将第二组苹果设为 2 等(请参阅上面所需的输出)。也开放给data.table 解决方案。

最佳答案

library(data.table)
dt[, id := cumsum(c(TRUE, diff(index) > 1)), by="group"]
dt
#     index  group id
#  1:     1  apple  1
#  2:     2  apple  1
#  3:     3 orange  1
#  4:     4 orange  1
#  5:     5 orange  1
#  6:     6 orange  1
#  7:     7  apple  2
#  8:     8  apple  2
#  9:     9 orange  2
# 10:    10  apple  3

从原始 dt 开始:

library(dplyr)
dt %>%
  group_by(group) %>%
  mutate(id = cumsum(c(TRUE, diff(index) > 1))) %>%
  ungroup()
# # A tibble: 10 x 3
#    index group     id
#    <int> <chr>  <int>
#  1     1 apple      1
#  2     2 apple      1
#  3     3 orange     1
#  4     4 orange     1
#  5     5 orange     1
#  6     6 orange     1
#  7     7 apple      2
#  8     8 apple      2
#  9     9 orange     2
# 10    10 apple      3

Base R,可能有点笨重:

out <- do.call(rbind, by(dt, dt$group,
                         function(x) transform(x, id = cumsum(c(TRUE, diff(index) > 1)))))
out[order(out$index),]
#          index  group id
# apple.1      1  apple  1
# apple.2      2  apple  1
# orange.3     3 orange  1
# orange.4     4 orange  1
# orange.5     5 orange  1
# orange.6     6 orange  1
# apple.7      7  apple  2
# apple.8      8  apple  2
# orange.9     9 orange  2
# apple.10    10  apple  3

可以使用 rownames(out) <- NULL 轻松删除名称。 order 部分不是必需的,但我想以与其他解决方案相同的顺序呈现它,并且 do.call/by 不保留原始顺序。

关于r - R中行的有序分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57155017/

10-11 07:49