通过名称的部分匹配汇总行并根据名称数据库重命名

Sum up rows by partial match of name and rename based on a name database

很长一段时间后,我再次使用 R 工作,因此我有点生疏。感谢您的每一点帮助。

所以我有一个调查,其中包含许多矩阵问题,甚至是对偶矩阵。在此示例中,它是一个双矩阵,调查问题的格式为 Question.AnswerCode..FirstOrSecondMatrix。我制作了一个如下所示的频率数据框:

从我的原始数据中进行子集化以进行复制 - 德语列,未排序

dput(PIL)
structure(list(gering = c(12L, 9L, 12L, 3L, 12L, 8L, 3L, 10L, 
12L, 6L, 7L, 7L), hoch = c(32L, 45L, 28L, 43L, 39L, 44L, 20L, 
20L, 17L, 20L, 28L, 18L), `keine Angabe` = c(6L, 20L, 12L, 30L, 
9L, 24L, 9L, 16L, 10L, 17L, 10L, 17L), mittel = c(27L, 32L, 15L, 
27L, 23L, 27L, 19L, 18L, 20L, 25L, 10L, 24L), `sehr gering` = c(17L, 
10L, 28L, 1L, 14L, 2L, 1L, 1L, 3L, 2L, 15L, 4L), `sehr hoch` = c(22, 
0, 21, 12, 19, 11, 18, 5, 8, 0, 0, 0), Summe = c(116, 116, 116, 
116, 116, 116, 70, 70, 70, 70, 70, 70)), row.names = c("PIL.PILK1..1.", 
"PIL.PILK1..2.", "PIL.PILK2..1.", "PIL.PILK2..2.", "PIL.PILK3..1.", 
"PIL.PILK3..2.", "PIL2.PILK1..1.", "PIL2.PILK1..2.", "PIL2.PILK2..1.", 
"PIL2.PILK2..2.", "PIL2.PILK3..1.", "PIL2.PILK3..2."), class = "data.frame")

结果我尝试实现这一点:

我想通过字符串“PILK1”= Prozess1 的中间部分连接(求和)行并将其重命名为“Prozess 1..1”。或 Prozess1..2."。然后用 grepl 将最后一步“..1.”重命名为所需的输出,我很确定可以完成此操作,因为它只有两个选项。但是我所有的搜索都没有帮助我使用部分字符串和进程名称从第二个数据框中重命名字符串的一部分。名称列表(数据框)包含 100 多个名称作为缩写字符串和全名。

我卡在哪里

非常感谢

PS:到目前为止,我的解决方法是直接解决它,即 Prozess1_Intensity<- table(ifelse(!is.na(PIL.PILK1..1.),PIL.PILK1..1., PIL2.PILK1..1.), useNA = "always") 并将所有项目绑定到数据框中。但这是大量的复制和粘贴,或者在我的情况下,将 Excel 中的所有内容链接在一起并将其粘贴到 R 中,如果应用于整个调查

,这将变得乏味

如果查找 table 以匹配进程名称及其缩写称为 lookup

library(dplyr)
library(tidyr)

lookup <- data.frame(prozess_name = c('Prozess1', 'Prozess2', 'Prozess3'), 
                     abbrev = c('PILK1', 'PILK2', 'PILK3'))

lookup

#  prozess_name abbrev
#1     Prozess1  PILK1
#2     Prozess2  PILK2
#3     Prozess3  PILK3

您可以使用 extract 将行名分成 3 个单独的列,使用查找连接并使用 across 对列值求和。

PIL %>%
  rownames_to_column('abbrev') %>%
  extract(abbrev, c('PIL','abbrev', 'num'), '(PIL\d?)\.(PILK\d+)\.\.(\d+)\.') %>%
  left_join(lookup, by = 'abbrev') %>%
  group_by(prozess_name, num) %>%
  summarise(across(gering:Summe, sum, na.rm = TRUE)) %>%
  ungroup

#  prozess_name num   gering  hoch `keine Angabe` mittel `sehr gering` `sehr hoch` Summe
#  <chr>        <chr>  <int> <int>          <int>  <int>         <int>       <dbl> <dbl>
#1 Prozess1     1         15    52             15     46            18          40   186
#2 Prozess1     2         19    65             36     50            11           5   186
#3 Prozess2     1         24    45             22     35            31          29   186
#4 Prozess2     2          9    63             47     52             3          12   186
#5 Prozess3     1         19    67             19     33            29          19   186
#6 Prozess3     2         15    62             41     51             6          11   186