我需要重新设计此代码,以便它包含可以读取"inpatient"的所有内容 - 包括拼写错误时?



我要么需要找到一种方法来重新编码,以包括住院患者的拼写错误版本,要么"标记"那些没有受到影响的版本?

df1$Admission_Type <- as.character(df1$Admission_Type)
df1$Admission_Type[df1$Admission_Type == "Inpatient"]<-"ip"
df1$Admission_Type[df1$Admission_Type == "inpatient"]<-"ip"
df1$Admission_Type[df1$Admission_Type == "INPATIENT"]<-"ip"

它像这样重复。

要处理大小写问题,请将所有转换为小写

df1 <- data.frame(Admission_Type = c("Inpatient", "inpatient", "INPATIENT", "inp", "impatient"), stringsAsFactors = FALSE)
df1$Admission_Type <- tolower(df1$Admission_Type)

然后您可以使用正则表达式来处理拼写错误。虽然不可能得到所有,但你可以用直觉来接近。在我的例子中,我故意拼错了"不耐烦"。您可以设置一个正则表达式来检测这种可能常见的错误,例如

grep("^i[nm]pat[ie][ei]nt", df1$Admission_Type, ignore.case = TRUE)

我允许第二个位置是"n"或"m",或者"ie"在6-7位置切换。这将返回

[1] 1 2 3 5

您可以在每个位置添加可能拼写错误的字母。关于如何使正则表达式更加复杂以允许在搜索时丢失/额外的字母,有很多提示。

请注意,您可以使用gsub自动进行更换。

df1$Admission_Type[grepl("inpatient", df1$Admission_Type, ignore.case=TRUE)] = "ip"将涵盖您列出的案例@JohnSG的答案展示了如何将潜在的拼写错误也包括在正则表达式中。(您可能希望创建一个新列来存储您的记录(至少在测试不同选项时),而不是覆盖原始数据列。)

正如@aliastaire所提到的,您可以使用agrep进行近似匹配。例如:

x = c("inpatient","Inpatient","Impatient","inpateint")
agrep("inpatient", x, max.dist=2, ignore.case=TRUE)

所以,在你的情况下,你可以做:

df1$Admission_Type[agrep("inpatient", df1$aAdmisstion_Type, max.dist=2, ignore.case=TRUE)] = "ip"

CCD_ 4返回匹配值的索引。max.dist控制实际值与目标值的不同程度,并且仍然被视为匹配。您可能需要对此进行测试和调整,以捕捉拼写错误,同时避免不正确的匹配。

grepl涵盖了您在问题中列出的情况,但为了将来参考,如果您确实需要匹配多个单独的值,您可以使用%in%函数来减少所需的代码量。在你的情况下,这将是:

df1$Admission_Type[df1$Admission_Type %in% c("Inpatient","inpatient","INPATIENT")]<-"ip"

最新更新