在从多个列的列表(带通配符)搜索后,将指示符变量添加到数据框

时间:2015-12-03 17:57:38

标签: r

我昨天发布的相关问题已经解决:请参阅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

提前感谢任何建议。

2 个答案:

答案 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)

祝你好运。