在多列中从列表(使用通配符)中搜索后,将指示符变量添加到数据帧中



我昨天发布了一个相关的问题,这个问题已经解决了:请参阅R-通过在多列中搜索带有通配符的列表来划分数据

前面的问题涉及基于代码列表的子集设置,在多个列中添加了"通配符"。

我今天的问题类似于,我想在数据帧中创建一个指示符变量,指示带有通配符(^M16,^M17)的列表(M16,M17)中的预定义代码之一是否出现在多个指定列(pr1,pr2,pr3)的任何位置

开始数据集

#make a simple data set
id = c(1,2,3,4,5,6)
pr1 = c("M151", "M141", "M161", "M177", "M197", "M200")
pr2 = c("M100", "M101", "M120", "M135", "M144", "M190")
pr3 = c("M210", "M205", "M167", "M121", "M166", "M174")
data <-  data.frame(id,pr1,pr2,pr3)

已通过带有通配符的M16和M17列表进行搜索的所需数据集

#desired output
id = c(1,2,3,4,5,6)
pr1 = c("M151", "M141", "M161", "M177", "M197", "M200")
pr2 = c("M100", "M101", "M120", "M135", "M144", "M190")
pr3 = c("M210", "M205", "M167", "M121", "M166", "M174")
indicator = c("0", "0", "1", "1", "1", "1")
data <-  data.frame(id,pr1,pr2,pr3,indicator)

我真的很难将通配符纳入我的编码中——不幸的是,由于工作时间有限,我没有几天的时间来解决这个问题。

编辑1:用更详细的澄清我的问题

我希望我能提供一个列表,其中a)列要搜索,b)代码要搜索函数。我试图修改下面给出的答案,但它告诉我"行和中有错误,因为x不是数字"。

columns <- c("pr1","pr2","pr3")
code <- c("M16", "M17")
code <- paste("^",code,sep="")
combined_code = paste(code, sep="")
for (n in names(data)){x <- cbind(x, grepl(combined_code, data[columns]))}
data$indicator <- rowSums(x)>1

提前感谢您的任何建议。

我们可以将"pr"列paste放在一起,然后使用grep创建"indicator"列

data$indicator <- +(grepl('\b(M16|M17)', 
               do.call(paste, data[grep('^pr', names(data))])))
data$indicator
#[1] 0 0 1 1 1 1

这是一个非常快速、笨拙但功能强大的解决方案。

for (n in names(data)){x<- cbind(x,grepl("^M16|^M17", data[,n]))}
data$indicator <- apply(x,1, any)

祝你好运。

相关内容

最新更新