我昨天发布的相关问题已经解决:请参阅R - Subseting data by searching a list with wildcards across multiple columns
此前一个问题与基于代码列表的子集相关,并带有添加的通配符'跨越多个专栏。
我今天的问题类似于我想在数据框中创建一个指示符变量,指示是否出现带有通配符(^ 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不是数字&#39;”。
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
提前感谢任何建议。
答案 0 :(得分:2)
我们可以paste
'pr'列合在一起,然后使用grep
创建'指标'列
data$indicator <- +(grepl('\\b(M16|M17)',
do.call(paste, data[grep('^pr', names(data))])))
data$indicator
#[1] 0 0 1 1 1 1
答案 1 :(得分:1)
这是一个非常快速而又肮脏但功能性很强的解决方案。
for (n in names(data)){x<- cbind(x,grepl("^M16|^M17", data[,n]))}
data$indicator <- apply(x,1, any)
祝你好运。