R:降低因子水平(同义词)

时间:2015-12-23 14:33:59

标签: r dictionary r-factor

我正在使用一个旧数据库,其中包含许多不同的代码。在这种情况下,我有一个变量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))]

它确实有效,但似乎有点冗长和低效。

你能帮我改进一下吗?

提前谢谢!

0 个答案:

没有答案