我昨天发布了一个相关的问题,这个问题已经解决了:请参阅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)
祝你好运。