R语言 如果多个数字列的名称共享最后3个字符,则将其合并

bis0qfac  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个包含150列的数据集,其中列被命名为Qa101到Qa150,Qb101到Qb150和Qc101到Qc150。计划是将名称的最后三个字符(例如,101)共享的列合并,并且每3个共享最后三个字符(例如,Qa101,Qb101和Qc101)的列只有一个,应该合并为Q101。的列是数值,并且可以确定的是,共享最后三个字符的这三列中只有一列保存值,并且另外两列是NA,例如Qa101保存值,Qb101和Qc101是NA,等等。我希望找到一个tidyverse的解决方案,但在这个阶段会解决任何事情。
我已经尝试了不同的不成功的方法使用dplyr函数,如:

  1. data.test <- data %>%
  2. mutate(across(where(~ str_match(., start = -3))),
  3. unite(remove = TRUE, na.rm = TRUE), .keep = "none")

字符串
但这显然是错的

k5ifujac

k5ifujac1#

如所述:
可以肯定的是,这三列中只有一列共享最后三个字符(例如,Qa101Qb101Qc101)持有一个值,另外两个是NA。
我创建了一个最小的示例数据集:

  1. set.seed(123)
  2. df <- as.data.frame(
  3. matrix(t(replicate(9, sample(c(sample(1:10, 1), NA, NA)))), 3, 9,
  4. dimnames = list(NULL, paste0(rep(c("Qa", "Qb", "Qc"), each = 3), 101:103)))
  5. )
  6. # Qa101 Qa102 Qa103 Qb101 Qb102 Qb103 Qc101 Qc102 Qc103
  7. # 1 NA NA NA 3 NA 8 NA 10 NA
  8. # 2 NA NA NA 2 3 9 NA NA NA
  9. # 3 NA 9 NA NA NA 1 4 NA NA

字符串

解决方案

您可以在列组上使用pivot_longer(),然后使用summarise()来保留行ID中唯一的非缺失值。

  1. library(tidyverse)
  2. df %>%
  3. mutate(ID = row_number()) %>%
  4. pivot_longer(matches("Q[abc]"),
  5. names_to = c(NA, ".value"),
  6. names_pattern = "(\\D+)(\\d+)") %>%
  7. summarise(across(`101`:`103`, ~ .x[!is.na(.x)][1], .names = "Q{.col}"),
  8. .by = ID)
  9. # ID Q101 Q102 Q103
  10. # <int> <int> <int> <int>
  11. # 1 1 3 10 8
  12. # 2 2 2 3 9
  13. # 3 3 4 9 1

展开查看全部

相关问题