[英]R: Search multiple columns for factors
我有一个带有多列的大型数据框(大约150个)。
有一系列列(Dx1,Dx2 ..直到Dx30)是诊断代码(这些代码是数字,但它们是与使用ICD-9编码系统进行医学诊断相对应的分类变量)。
我有可以搜索单个列的工作代码,但是需要搜索所有30列以查看是否有任何列包含指定范围(DXrange)内的代码。
核心数据框如下所示:
Case DX1 DX2 DX3 DX4...DX30
1 123 345 567 99 12
2 234 345 NA NA NA
3 456 567 789 345 34
这是工作代码:
## Defines a range of codes to search for
DXrange <- factor(41000:41091, levels = levels(core$DX1))
## Search for the DXrange codes in column DX1.
core$IndexEvent <- core$DX1 %in% DXrange & substr(core$DX1, 5, 5) != 2
## What is the frequency of the IndexEvent?
cat("Frequency of IndexEvent : \n"); table(core$IndexEvent)
工作代码改编自“计算全国再入学数据库(NRD)差异,报告#2017-01”
我可以为每个DX列运行此操作,然后将它们求和以得出最终的IndexEvent总计,但这并不是很有效。
在搜索代码之前,我首先将数据标准化,例如以下示例:
set.seed(314)
df <- data.frame(id = 1:5,
DX1 = sample(1:10,5),
DX2 = sample(1:10,5),
DX3 = sample(1:10,5))
require(dplyr)
require(tidyr)
df %>%
gather(key,value,-id) %>%
filter(value %in% 1:2)
或仅以R为底
df.long <- do.call(rbind,lapply(df[,2:4],function(x) data.frame(id = df$id, DX = x)))
df.long[df.long$DX %in% 1:2, ]
我们可以将filter_at
与any_vars
filter_at
使用
df %>%
filter_at(vars(matches("DX\\d+")), any_vars(. %in% DXrange))
哪里
DXrange <- 41000:41091
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.