首页 > 解决方案 > 根据名称数据库通过名称的部分匹配和重命名来汇总行

问题描述

很长一段时间后,我再次与 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 中,如果应用于整个调查,这将变得乏味

标签: rrowrename

解决方案


如果将进程名称与其缩写匹配的查找表称为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

您可以使用 将行名划分为 3 个单独的列extract,使用查找连接并使用 对列值求和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

推荐阅读