r - 根据名称数据库通过名称的部分匹配和重命名来汇总行
问题描述
很长一段时间后,我再次与 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 多个名称作为缩写字符串和全名。
我被困在哪里
- 如何通过部分匹配来识别一行并将它们相加
- 如何使用列表或数据框将字符串替换到字符串的某个点(图 3)
非常感谢
PS:到目前为止,我的解决方法是直接解决它,即将Prozess1_Intensity<- table(ifelse(!is.na(PIL.PILK1..1.),PIL.PILK1..1., PIL2.PILK1..1.), useNA = "always")
所有项目绑定到一个数据框中。但这是很多复制和粘贴,或者在我的情况下,将 Excel 中的所有内容链接在一起并将其粘贴到 R 中,如果应用于整个调查,这将变得乏味
解决方案
如果将进程名称与其缩写匹配的查找表称为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
推荐阅读
- sql - 使用 Oracle 的外部表从 .csv 文件插入数据
- linux - 实现两台Linux机器之间的请求/响应端口转发
- javascript - 将字符串数组转换为 dateTimes 数组
- scipy - 德劳内可以重复点吗?
- sql-server - 允许将 Access 应用程序与链接到 SQL Server 的表一起使用,而不给用户服务器角色?
- eclipse - 在Eclipse IDE控制台中,如何复制没有转义码字符的文本输出
- python - 在方法中访问方法中的变量
- javascript - 替换意外删除的新行
- sql-server - 使用 Powershell 将图像插入 VARBINARY(MAX) 类型的 SQL Server 列
- oracle - 触发输入新记录