【问题标题】:In R, create sequential 1 to N column based on values in other columns在 R 中,根据其他列中的值创建顺序 1 到 N 列
【发布时间】:2020-12-16 16:01:33
【问题描述】:

似乎是一个简单的数据操作问题,但是我们希望避免使用只比较每一行中的值的 for 循环。我们有以下数据框:

zed = data.frame(
  a = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1),
  b = c('a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'e', 'e', 'a', 'a'),
  c = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1),
  stringsAsFactors = FALSE
)

output = zed = data.frame(
  a = c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1),
  b = c('a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd', 'd', 'd', 'd', 'e', 'e', 'a', 'a'),
  c = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 1, 1),
  group = c(1, 1, 2, 2, 2, 3, 4, 5, 6, 6, 6, 7, 8, 8, 9, 9),
  stringsAsFactors = FALSE
)

> output
   a b c group
1  1 a 1     1
2  1 a 1     1
3  1 b 1     2
4  1 b 1     2
5  1 b 1     2
6  1 c 1     3
7  1 c 2     4
8  1 d 2     5
9  2 d 2     6
10 2 d 2     6
11 2 d 2     6
12 2 d 3     7
13 2 e 3     8
14 2 e 3     8
15 1 a 1     9
16 1 a 1     9

数据框以abc 列开头,我们需要将group 列添加到数据框中。 group 列从 1 开始,如果 abc 中的任何值与上一行中的值不同,则依次增加。

这并不像在 abc 上执行 group_by() 那样简单,因为同一行可以稍后出现,但不是按顺序出现在数据框中(例如,第 1,2 行 = = 第 15,16 行,但它们不一样 group 因为它们没有按顺序出现在数据框中)。

【问题讨论】:

    标签: r dplyr data-manipulation


    【解决方案1】:

    我们可以使用

    library(data.table)
    setDT(zed)[, group := .GRP, .(rleid(a, b, c))]
    

    【讨论】:

    • zed 不需要是数据表。你可以做zed$group <- data.table::rleidv(zed)
    • 你知道这个选项有什么好处吗:library(data.table); setDT(zed)[, group := rleid(a, b, c)][]? (+1)
    • @markus 您的方法或 AllanCameron 的方法可能更快。我可能想多了
    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多