R语言 2列中至少有一列发生变化时的累计和

8fq7wneg  于 2024-01-03  发布在  其他
关注(0)|答案(1)|浏览(135)

考虑一下我正在处理的这个名为data的简单数据集:

text          font_name           font_size
  <chr>         <chr>                   <dbl>
1 POND_RETRAITE BAAAAA+Arial-BoldMT        12
2 Pondération   BAAAAA+Arial-BoldMT        10
3 transversale  BAAAAA+Arial-BoldMT        10
4 finale        BAAAAA+Arial-BoldMT        10
5 du            BAAAAA+Arial-BoldMT        10
6 ménage        BAAAAA+Arial-BoldMT        10

字符串
我想创建一个名为group_var的向量,长度为nrow(data),将data的每个观测值分类到一个组中。每当font_namefont_size或两者都有修改时,组号都应该改变。
第一个观测值应该有自己的组。在这个例子中,group_var应该简单地是:

[1] 1 2 2 2 2 2


我尝试的代码是:

group_var <- cumsum(c(TRUE, diff(data$font_size != lag(data$font_size, 
             default = data$font_size[1])) != 0 | diff(data$font_name 
             != lag(data$font_name, default = data$font_name[1])) != 0))


然而,这将返回一个错误的输出,因为应该是一个新组的第一个元素有自己的单独组。请参阅:

print(group_var)
[1] 1 2 3 3 3 3


你能帮我解决这个简单的问题吗?

wr98u20j

wr98u20j1#

dplyr使用函数consecutive_id

library(tidyverse)

df %>% 
   mutate(group_var = consecutive_id(font_name, font_size))

           text           font_name font_size group_var
1 POND_RETRAITE BAAAAA+Arial-BoldMT        12         1
2   Pondération BAAAAA+Arial-BoldMT        10         2
3  transversale BAAAAA+Arial-BoldMT        10         2
4        finale BAAAAA+Arial-BoldMT        10         2
5            du BAAAAA+Arial-BoldMT        10         2
6        ménage BAAAAA+Arial-BoldMT        10         2

字符串
请注意,您可以使用data.table::rleid完成相同的操作

data.table::rleidv(df[-1])
[1] 1 2 2 2 2 2

with(df, data.table::rleid(font_name, font_size))
[1] 1 2 2 2 2 2


因此,ant可用作:

library(data.table)
setDT(df)[, group_var := rleid(font_name, font_size)][]
            text           font_name font_size group_var
1: POND_RETRAITE BAAAAA+Arial-BoldMT        12         1
2:   Pondération BAAAAA+Arial-BoldMT        10         2
3:  transversale BAAAAA+Arial-BoldMT        10         2
4:        finale BAAAAA+Arial-BoldMT        10         2
5:            du BAAAAA+Arial-BoldMT        10         2
6:        ménage BAAAAA+Arial-BoldMT        10         2

相关问题