繁体   English   中英

R 中大型数据集中多列的自动 grep()

[英]Automated grep() across multiple columns in large dataset in R

编辑底部的可重现示例...

我正在处理一个大型数据集(来自 CDC 的汇集 NHAMCS):

> dim(ed0509) [1] 174020 514

我在使用grep()根据多列变量DIAG1 DIAG2 DIAG3基于感兴趣的向量列表DIAG2 DIAG3数据框中的SSTI.list 条件是,如果此模式在列变量之一中被识别,那么我想提取该行号以最终使用它来对数据进行子集化以在数据集中创建一个新的分类列SSTI.cat (0 或 1) .

SSTI.list <- c("035", "566", "60883", "6110", "6752", "6751", "680","681","682","683","684","684","685","686", "7048", "70583","7070", "7078", "7079", "7071", "7280", "72886", "7714", "7715", "7854", "9583", "99662", "99762", "9985")

由于我正在处理一个相当长的 > 1000 个元素列表,因此我正在尝试使用 for 循环自动执行此过程。 所需的输出是具有新变量,其中包含向量SSTI.list每个值的行列表。 我主要在grep()运行 for 循环时遇到问题,并且出现错误:

argument 'pattern' has length > 1 and only the first element will be used

到目前为止我尝试做的是:

diags <- c(ed0509$DIAG1,ed0509$DIAG2,ed0509$DIAG3)

for (i in SSTI.list){ assign(paste("var",i,sep=""),grep(paste("^",i,"",sep=""),diags,value=F)) }

SSTI.comb将是最终的行列表(所有var i), SSTI.list从用于创建分类变量SSTI.cat的 for 循环中识别出SSTI.list的模式

然后使用data.table包创建分类变量。

SSTI.comb<-sort(as.numeric(SSTI.comb))

setDT(ed0509)[SSTI.comb,SSTI.cat:=1][,SSTI.cat:=0]

为可重复性进行编辑,对此感到抱歉......

DIAG1=c("00000","4659-","0356-","5664-","771--","7715-","78791")
DIAG2=c("3829-","00000","00000","4659-","7854-","00000","566--")
DIAG3=c("9985-","00000","00000","00000","00000","00000","00000")
df<-data.frame(DIAG1,DIAG2,DIAG3)`

SSTI.list <- c("035","9985","7854","771","7715")

for (i in SSTI.list){
assign(paste("var",i,sep=""),grep(paste("^",i,"",sep=""),diags,value=F))
}

从概念上讲,我想要一个输出,其中附加到df的新列变量将指示第 1、第 3、第 5 和第 6 行被识别以满足SSTI.list指示的模式

DIAG1 DIAG2 DIAG3 SSTI.cat
1 00000 3829- 9985-        1
2 4659- 00000 00000        0
3 0356- 00000 00000        1
4 5664- 4659- 00000        0
5 771-- 7854- 00000        1
6 7715- 00000 00000        1
7 78791 566-- 00000        0

这是我在您添加数据之前制作的虚假数据示例。 如果这是您的想法,请告诉我:

SSTI.list <- c("035", "566", "60883", "6110", "6752", "6751", "680","681","682","683","684","684",
               "685","686", "7048", "70583","7070", "7078", "7079", "7071", "7280", "72886", 
               "7714", "7715", "7854", "9583", "99662", "99762", "9985")

# Fake data
set.seed(10)
dat = as.data.frame(replicate(5, sample(c(SSTI.list, 1e5:(1e5+1000)),10)), stringsAsFactors=FALSE)
 V1 V2 V3 V4 V5 1 100493 100642 100861 100522 100254 2 100286 100555 100604 100066 100206 3 100409 100087 100767 100145 7048 4 100682 100583 100336 100895 100719 5 100058 100338 100387 100404 100227 6 100202 100410 100695 100737 100136 7 100252 100024 100829 100813 7078 8 100249 100241 100216 100947 100468 9 100600 100378 100758 100671 100076 10 100998 100824 100334 100482 100789
# Match any instance of a pattern within any element of the data
dat[apply(dat, 1, function(i) any(grepl(paste(SSTI.list, collapse="|"), i))),]
 V1 V2 V3 V4 V5 3 100409 100087 100767 100145 7048 4 100682 100583 100336 100895 100719 # "100682 matches "682" in SSTI.list 7 100252 100024 100829 100813 7078
# Match only if a data element is exactly the same as one of the patterns.
dat[apply(dat, 1, function(i) any(grepl(paste(paste0("^",SSTI.list,"$"), collapse="|"), i))),]
 V1 V2 V3 V4 V5 3 100409 100087 100767 100145 7048 7 100252 100024 100829 100813 7078

如果您只想要匹配行的行索引:

which(apply(dat, 1, function(i) any(grepl(paste(SSTI.list, collapse="|"), i))))

[1] 3 4 7

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM