R语言 递增分组标识符

jgovgodb  于 2022-12-06  发布在  其他
关注(0)|答案(4)|浏览(155)

我有如下示例数据:

library(data.table)
dat <- fread("Survey Variable_codes_2022
              D       D1
              A       A1
              B       B1
              B       B3
              B       B2
              E       E1
              B       NA
              E       NA")

对于具有Variable_codes_2022==NA的两行,我希望递增变量code,使其变为:

dat <- fread("Survey Variable_codes_2022
              D       D1
              A       A1
              B       B1
              B       B3
              B       B2
              E       E1
              B       B4
              E       E2"

因为列Variable_codes_2022是字符串变量,所以数字不按数字顺序排列。
我不知道从哪里开始,我想知道是否有人可以帮助我在正确的轨道上。

jljoyd4f

jljoyd4f1#

我们可以这样做:
1.分组
1.排列和

  1. mutate .
    为了保持原来的顺序,我们可以先创建id,然后重新排列:
    第一个
b09cbbtk

b09cbbtk2#

data.table选项使用rleid,如下所示:

library(data.table)
dat[, Variable_codes_2022 := paste0(Survey, rleid(Variable_codes_2022)), by = Survey]
dat
#>    Survey Variable_codes_2022
#> 1:      D                  D1
#> 2:      A                  A1
#> 3:      B                  B1
#> 4:      B                  B2
#> 5:      B                  B3
#> 6:      E                  E1
#> 7:      B                  B4
#> 8:      E                  E2

创建于2022年12月1日,reprex v2.0.2

dy2hfwbg

dy2hfwbg3#

dat <- 
structure(list(survey = c("D", "A", "B", "B", "B", "E", "B", 
"E", "B"), var_code = c("D1", "A1", "B1", "B3", "B2", "E1", NA, 
NA, NA)), row.names = c(NA, -9L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x0000026db10f1ef0>)

library(dplyr)
library(stringr)

dat %>% 
  group_by(survey) %>% 
  mutate(
    aux1 = as.numeric(stringr::str_remove(var_code,survey)),
    aux2 = cumsum(is.na(var_code)),
    var_code = paste0(survey,max(aux1,na.rm = TRUE)+aux2)
    ) %>% 
  ungroup() %>% 
  select(-aux1,-aux2)

# A tibble: 9 x 2
  survey var_code
  <chr>  <chr>   
1 D      D1      
2 A      A1      
3 B      B3      
4 B      B3      
5 B      B3      
6 E      E1      
7 B      B4      
8 E      E2      
9 B      B5
drkbr07n

drkbr07n4#

rowid的解决方案。向样本中添加了一个额外的元素,以便针对多个缺失进行测试

library(data.table)
#> Warning: package 'data.table' was built under R version 4.2.2
dat <- fread("Survey Variable_codes_2022
              D       D1
              A       A1
              B       B1
              B       B3
              B       B2
              E       E1
              B       NA
              E       NA
              E       NA")

dat[, n := as.numeric(substr(
  Variable_codes_2022, nchar(Survey)+1, nchar(Variable_codes_2022)))]

dat[is.na(n),
  Variable_codes_2022 := paste0(Survey, rowid(Survey) + 
    dat[.SD[,.(Survey)], .(m=max(n, na.rm=T)), on = "Survey", by=.EACHI ][,m])]

dat                                                                      
#>    Survey Variable_codes_2022  n
#> 1:      D                  D1  1
#> 2:      A                  A1  1
#> 3:      B                  B1  1
#> 4:      B                  B3  3
#> 5:      B                  B2  2
#> 6:      E                  E1  1
#> 7:      B                  B4 NA
#> 8:      E                  E2 NA
#> 9:      E                  E3 NA

相关问题