R语言 递增分组标识符

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

我有如下示例数据:

  1. library(data.table)
  2. dat <- fread("Survey Variable_codes_2022
  3. D D1
  4. A A1
  5. B B1
  6. B B3
  7. B B2
  8. E E1
  9. B NA
  10. E NA")

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

  1. dat <- fread("Survey Variable_codes_2022
  2. D D1
  3. A A1
  4. B B1
  5. B B3
  6. B B2
  7. E E1
  8. B B4
  9. E E2"

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

jljoyd4f

jljoyd4f1#

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

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

b09cbbtk2#

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

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

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

dy2hfwbg

dy2hfwbg3#

  1. dat <-
  2. structure(list(survey = c("D", "A", "B", "B", "B", "E", "B",
  3. "E", "B"), var_code = c("D1", "A1", "B1", "B3", "B2", "E1", NA,
  4. NA, NA)), row.names = c(NA, -9L), class = c("data.table", "data.frame"
  5. ), .internal.selfref = <pointer: 0x0000026db10f1ef0>)
  6. library(dplyr)
  7. library(stringr)
  8. dat %>%
  9. group_by(survey) %>%
  10. mutate(
  11. aux1 = as.numeric(stringr::str_remove(var_code,survey)),
  12. aux2 = cumsum(is.na(var_code)),
  13. var_code = paste0(survey,max(aux1,na.rm = TRUE)+aux2)
  14. ) %>%
  15. ungroup() %>%
  16. select(-aux1,-aux2)
  17. # A tibble: 9 x 2
  18. survey var_code
  19. <chr> <chr>
  20. 1 D D1
  21. 2 A A1
  22. 3 B B3
  23. 4 B B3
  24. 5 B B3
  25. 6 E E1
  26. 7 B B4
  27. 8 E E2
  28. 9 B B5
展开查看全部
drkbr07n

drkbr07n4#

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

  1. library(data.table)
  2. #> Warning: package 'data.table' was built under R version 4.2.2
  3. dat <- fread("Survey Variable_codes_2022
  4. D D1
  5. A A1
  6. B B1
  7. B B3
  8. B B2
  9. E E1
  10. B NA
  11. E NA
  12. E NA")
  13. dat[, n := as.numeric(substr(
  14. Variable_codes_2022, nchar(Survey)+1, nchar(Variable_codes_2022)))]
  15. dat[is.na(n),
  16. Variable_codes_2022 := paste0(Survey, rowid(Survey) +
  17. dat[.SD[,.(Survey)], .(m=max(n, na.rm=T)), on = "Survey", by=.EACHI ][,m])]
  18. dat
  19. #> Survey Variable_codes_2022 n
  20. #> 1: D D1 1
  21. #> 2: A A1 1
  22. #> 3: B B1 1
  23. #> 4: B B3 3
  24. #> 5: B B2 2
  25. #> 6: E E1 1
  26. #> 7: B B4 NA
  27. #> 8: E E2 NA
  28. #> 9: E E3 NA
展开查看全部

相关问题