r - 跨多个列匹配多个字符串并创建一个是/否 (1/0) 列
问题描述
编辑添加代码:
我正在尝试从使用 SAS 的同事那里复制一些工作。我们在 SAS 中将文本(与布尔值匹配)转换为数字的导入存在问题。
这项工作的目的是识别要传递的特定记录,因此我们需要保留原始导入的值(我认为 R 能够做到这一点)。现在我们正在手动解决这个问题,因为它的记录数量很少,但这可能并不总是正确的。
我遇到的问题是我需要在 R 中复制他们的矩阵数组。如果满足条件,则应将多个条件标记为 1,如下所示: SAS 代码
我需要能够评估 12 列之一(例如:Q16意味着字符串只需要以 Q16) 开头。此外,12 个中的任何一个都可以通过它在后面的字段中变得更稀疏。
如果可能的话,我正在尝试找到最有效和最紧凑的方法。
对于更复杂的问题,我对 R 还是有些陌生,所以我受到了阻碍。我用 grep 和 grepl 尝试了一些方法,但都没有结果。当我尝试正则表达式时,我尝试在 ifelse 中单独使用每个字符串,然后我还尝试了一个带有“|”的更大字符串 运营商,但也没有运气。我还尝试了 base (apply) 和 dplyr 方法。
任何帮助表示赞赏。
数据结构为: Example Table
示例数据代码:
structure(list(record = 1:20,
icd1 = c("Q753", "Q620", "Q825", "Q211", "Q828", "Q6532", "Q673", "Q380", "Q5310", "Q040", "Q107", "Q6689", "Q860", "Q753", "Q000", "Q673", "Q860", "Q673", "H9190", "Q381"),
icd2 = c("Q141",NA,NA, "Q170", NA, NA, NA, NA, NA, NA, NA, "Q211", NA, NA, "Q211", "Q673", NA, "115", "Q759", "Q753"),
icd3 = c("Q579", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Q038", "H4657", "Q211"),
icd4 = c("Q656", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Q999", NA, NA),
icd5 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Q5301", NA, NA),
icd6 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "Q168", NA, NA),
icd7 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
icd8 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
icd9 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
icd10 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
icd11 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
icd12 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)),
.Names = c("record", "icd1", "icd2", "icd3", "icd4", "icd5", "icd6", "icd7", "icd8", "icd9", "icd10", "icd11", "icd12"),
class = "data.frame", row.names = c(NA, -20L))
感兴趣的字符串:
case2 <- "^H4703| ^H90*| ^H91*| ^Q000| ^Q001| ^Q002| ^Q01*| ^Q02| ^Q03*|
^Q04*| ^Q05*| ^Q070*| ^Q110| ^Q111| ^Q112| ^Q120| ^Q122| ^Q130| ^Q138|
^Q139| ^Q141| ^Q142| ^Q143| ^Q148| ^Q149| ^Q16*| ^Q65*| ^Q66*| ^Q674|
^Q688| ^Q743| ^Q758| ^Q759| ^Q828"
解决方案
为此,我稍微修改了您的字符串。简而言之,我将您的数据框从宽转换为长,然后我将每一列总结为具有(TRUE)或不具有(FALSE)您想要的任何字符串。
case2 <- "H4703|H90|H91|Q000|Q001|Q002|Q01|Q02|Q03|Q04|Q05|Q070|Q110|Q111|Q112|Q120|Q122|Q130|Q138|Q139|Q141|Q142|Q143|Q148|Q149|Q16|Q65|Q66|Q674|Q688|Q743|Q758|Q759|Q828"
library(dplyr)
library(tidyr)
df %>%
gather(column, string, -record) %>%
group_by(column) %>%
summarise(contains_string = sum(grepl(case2, string))>0)
#> # A tibble: 12 x 2
#> column contains_string
#> <chr> <lgl>
#> 1 icd1 TRUE
#> 2 icd10 FALSE
#> 3 icd11 FALSE
#> 4 icd12 FALSE
#> 5 icd2 TRUE
#> 6 icd3 TRUE
#> 7 icd4 TRUE
#> 8 icd5 FALSE
#> 9 icd6 TRUE
#> 10 icd7 FALSE
#> 11 icd8 FALSE
#> 12 icd9 FALSE
编辑
这是每一行。
df %>%
gather(column, string, -record) %>%
group_by(record) %>%
mutate(contains_string = sum(grepl(case2, string))>0) %>%
spread(column, string)
#> # A tibble: 20 x 14
#> # Groups: record [20]
#> record contains_string icd1 icd10 icd11 icd12 icd2 icd3 icd4 icd5
#> <int> <lgl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 1 TRUE Q753 <NA> <NA> <NA> Q141 Q579 Q656 <NA>
#> 2 2 FALSE Q620 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 3 3 FALSE Q825 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 4 4 FALSE Q211 <NA> <NA> <NA> Q170 <NA> <NA> <NA>
#> 5 5 TRUE Q828 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 6 6 TRUE Q6532 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 7 7 FALSE Q673 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 8 8 FALSE Q380 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 9 9 FALSE Q5310 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 10 10 TRUE Q040 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 11 11 FALSE Q107 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 12 12 TRUE Q6689 <NA> <NA> <NA> Q211 <NA> <NA> <NA>
#> 13 13 FALSE Q860 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 14 14 FALSE Q753 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 15 15 TRUE Q000 <NA> <NA> <NA> Q211 <NA> <NA> <NA>
#> 16 16 FALSE Q673 <NA> <NA> <NA> Q673 <NA> <NA> <NA>
#> 17 17 FALSE Q860 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
#> 18 18 TRUE Q673 <NA> <NA> <NA> 115 Q038 Q999 Q5301
#> 19 19 TRUE H9190 <NA> <NA> <NA> Q759 H4657 <NA> <NA>
#> 20 20 FALSE Q381 <NA> <NA> <NA> Q753 Q211 <NA> <NA>
#> # ... with 4 more variables: icd6 <chr>, icd7 <chr>, icd8 <chr>,
#> # icd9 <chr>
由reprex 包(v0.2.0)于 2018 年 9 月 19 日创建。
推荐阅读
- python - 如何使用 Manim 为对象颜色变化设置动画?
- nservicebus - NServiceBus:访问功能中的可恢复性
- julia - 在 Julia 的 CSV 文件中解析 DateTime
- javascript - 使用嵌套的 for 循环更改数组内的对象键
- python - 如何通过在 Pandas 中按一列分组并匹配另一列来获取转换后的数据框
- mysql - AWS RDS-MySQL 显示比预期/实际数据库大小更多的存储使用量
- r - 将汇总的数据整理成整齐的格式
- python - 如何通过单击 GUI 中的按钮来创建新的数据图窗口
- javascript - 如果表格只有一行,则 HTML 表格中的列宽会发生变化
- java - API在android studio中不断返回401,但在浏览器中返回ok