跨组顺序编号,无需在 r 中重新启动序列[重复]

问题描述 投票:0回答:1

我想在示例数据框中创建“转向”列。我有一个包含数千行的更大数据集。该列将指示扬声器当前的轮次。即使句子跨不同行,如果由同一说话者说出,也将算作同一轮。那么,下次轮到该人发言时,将是第 n 轮。

df <- data.frame(
  line = c(1:9),
  speaker = c("nick", "nick", "nick", "bob", "nick", "ann", "ann", "nick", "bob"),
  sentence = c("hi", "how are you?", "what's up?", "i'm good", "me too", "hi guys", "any plans for the weekend", "no", "ya, the movies"),
  turn = c(1, 1, 1, 2, 3, 4, 4, 5, 6))

我用过:

  • group_by(speaker) %>% mutate(turn2 = cur_group_id()) - 但它按发言者姓名按字母顺序编号,并且相同的发言者被编码为相同的数字,例如,Nick 始终编号为 3,但应编号为第 1、3 和 5 圈:
   line speaker sentence      turn turn_curgroupid
1     1 nick    hi               1               3
2     2 nick    how are you?     1               3
3     3 nick    what's up?       1               3
4     4 bob     i'm good         2               2
5     5 nick    me too           3               3
6     6 ann     hi guys          4               1
  • seq_along(speaker) - 按顺序计算每个扬声器的行数,尽管它是同一回合,例如,应该是尼克的第一回合,编号为 1:3
   line speaker sentence      turn turn_seqalong
1     1 nick    hi               1             1
2     2 nick    how are you?     1             2
3     3 nick    what's up?       1             3
4     4 bob     i'm good         2             1
5     5 nick    me too           3             4
6     6 ann     hi guys          4             1

感谢您的帮助。

r group-by tidyverse sequence mutate
1个回答
1
投票
df |>
  mutate(turn2 = cumsum(speaker != lag(speaker, 1, "")),
         turn3 = consecutive_id(speaker)) 
         # H/T @andre-wildberg for mentioning this useful dplyr 1.1.0 function

结果

  line speaker                  sentence turn turn2 turn3
1    1    nick                        hi    1     1     1
2    2    nick              how are you?    1     1     1
3    3    nick                what's up?    1     1     1
4    4     bob                  i'm good    2     2     2
5    5    nick                    me too    3     3     3
6    6     ann                   hi guys    4     4     4
7    7     ann any plans for the weekend    4     4     4
8    8    nick                        no    5     5     5
9    9     bob            ya, the movies    6     6     6
© www.soinside.com 2019 - 2024. All rights reserved.