我正在使用一个旧数据库,其中包含许多不同的代码。在这种情况下,我有一个变量drug
,其名称与一些药物化合物不同。我为所有“同义词”创建了一个“词典”:
td.codes <- list(
[...]
medication = list(
acenocoumarol = c("ACENOCOUMARON", "SINTROM MITIS"),
fenprocoumon = "MARCOUMAR",
[...]
)
)
当我读入我的数据时,我使用factor(drug)
来创建药物变量,其中包含所有不同的名称。我想删除专业名称,只是拥有通用药物名称。
我想我能做到:
levels(drug) <- names(td.codes$medication)[sapply(levels(drugs), grep, td.codes$medication)]
我从sapply
获得的列表中遇到了麻烦(我仍在努力应用vapply)但即使我unlist(lapply(...))
我得到的integer(0)
值也未被强制转移到NA
{1}}但显然随机地将值分配给不在字典中的药物。
然后我想到了第一次清理所有未包括的级别:
levels(data$drug)[which(!(levels(data$drug) %in% unlist(td.codes$medication)))] <- NA
然后循环遍历td.codes$medication
中的所有药物,但我更喜欢“更干净”的东西,因为数据库可能变得非常大。
我的数据如下:
pid drug [...]
1 "ACENOCOUMARON"
2 "MARCOUMAR"
3 "11"
[...]
我提前用谷歌搜索了R中的因子和等级,但我遇到的所有问题都是因为R没有足够的等级而不是太多,或者减少了未使用的等级。
提前感谢您的帮助!
修改
阅读this thread后,我提出了这个想法:
factor(drug, exclude = unique(drug)[which(!(unique(drug) %in% unlist(td.codes$medication)))])
levels(drug) <- names(td.codes$medication)[unlist(sapply(levels(drug), grep, td.codes$medication))]
它确实有效,但似乎有点冗长和低效。
你能帮我改进一下吗?
提前谢谢!