【发布时间】:2018-09-13 22:31:20
【问题描述】:
我的问题是我有一列数据(字符和数字组合),我想检查每个字段是否与不同 df 的列中的一个字段部分匹配,如果它确实写入将第二个 df 中的对应值放入第一个变量的新列中。
所以更实际:
df1 (2x60k)=
QST_ID QST_CODING
1 M79.68
2 A01.1
3 K07
4 Z09
df2 (2x2451)=
icd name
A01 intestinal diseases
...
K07 Diseases of oral cavity
目标是让 df1 =
QST_ID QST_CODING QST_CODING_RC_NAME
1 M79.68 diseaseX
2 A01.1 Intestinal diseases
3 K07 Diseases of oral cavity
4 Z09 diseaseY
最简单的解决方法是忽略 .并且基本上将“icd”视为 icd* 但我没有让这个适用于整个列表。
我尝试使用 match、pmatch 和 grep 函数执行此操作,并尝试使用 ^(正则表达式通配符)作为所有 icd 的前缀,但它根本不起作用:
df1$QST_CODING_RC_name <- df2$name[pmatch(as.character(df1$QST_CODING), df2$icd, duplicates.ok = T)]
df1$QST_CODING_RC_name <- df2$name[grep(df2$icd, as.character(df1$QST_CODING), ignore.case = T)]
如果有人对此有解决方案,我将非常高兴。非常感谢您的帮助。
编辑: QST_CODING 包含不同形式的值(g.523 等),其中该点之后的信息需要稍后使用,不能简单地删除。此外,在 QST_CODING 中,点前部分和点后部分的长度不同。
【问题讨论】:
-
首先使用
gsub("\\..*", "", df1$QST_CODING)或类似的方式将.之后的所有内容全部删除,然后使用merge(df1, df2, by.x="QST_CODING", by.y="icd", all.x=TRUE)。 -
更正:
by.x="QST_abbreviated",即gsub命令创建的列。 -
这是要求部分匹配。可能是重复的,但可能不是指定的 Q。搜索:“合并部分匹配 [r]”。如果问题是“如何将一列的前三个字符与另一列匹配,那么精确匹配的答案可能是有意义的。
-
非常感谢您的帮助。不幸的是,这不起作用,因为 QST_CODING 还包含 g.235、K-325.65 等值。而且因为这些是不同的代码,我需要它们保持原样并稍后重新编码。对于仅匹配前 x 个字符的解决方案:QST_CODING 具有不同的长度(在点 a- 之前以及总共)。
-
这个问题有一个与 ICD 代码相关的特定答案,所以可能不是重复的。使用 icd CRAN 包(我是作者),有经过试验和测试的算法可以做到这一点。我认为你正在做的是分配合并症。 icd 可以使用标准化的疾病组来做到这一点,或者您可以使用自己的。这一切都有据可查。 jackwasey.github.io/icd
标签: r regex pattern-matching match matching