R use用于跨行查找模式

时间:2015-09-11 15:00:09

标签: r grep apply

我正在尝试创建一个标志,以确定某个代码是否出现在数据集的给定行中的任何单元格中。它必须是完全匹配 - 换句话说,如果我正在寻找'a1'grep('a1', 'a123')应该返回false

下面是我试图使用的代码,但没有任何运气。它只是给我匹配列的列号。

dfa <- data.frame(a = letters[1:10], b = letters[11:20], c = letters[5:14])
dfa$d = paste(dfa$a, dfa$b, sep = '')
vtc1 <- c('a','b','c', 'd')
for(i in vtc1){
    newColName <- paste(i,'_flag',sep = '')
    dfa[,newColName] <- apply(dfa[,vtc1], 1, function(x) as.numeric(grep(i, x, ignore.case = T)))
}

我正在尝试为每个有问题的值创建一堆标志列。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

将^和$添加到正则表达式中。 ^表示字符串的开头,$表示结束。 grepl()给出一个TRUE / FALSE向量

any(grepl(paste0("^", i "$"), x, ignore.case = TRUE))

答案 1 :(得分:0)

由于您要求完全匹配,请在申请length(which(x==i)时更改您的功能。然后我得到以下输出:

   a b c  d a_flag b_flag c_flag d_flag
1  a k e ak      1      0      0      0
2  b l f bl      0      1      0      0
3  c m g cm      0      0      1      0
4  d n h dn      0      0      0      1
5  e o i eo      0      0      0      0
6  f p j fp      0      0      0      0
7  g q k gq      0      0      0      0
8  h r l hr      0      0      0      0
9  i s m is      0      0      0      0
10 j t n jt      0      0      0      0

答案 2 :(得分:0)

我喜欢使用stringr来保证参数和可读性的一致性,并data.table以避免在执行apply操作时使用data.frame,因为语法并不特别好的。

library(data.table)
library(stringr)

dfa = setDT(dfa)
for(i in vtc1){
  dfa[, paste(i, "flag") := str_detect(paste(a, b, c, d),          # concatenate row
                                        paste0("\\b", i, "\\b"))]  # look for i
}

data.frame(dfa)
   a b c  d a.flag b.flag c.flag d.flag
1  a k e ak   TRUE  FALSE  FALSE  FALSE
2  b l f bl  FALSE   TRUE  FALSE  FALSE
3  c m g cm  FALSE  FALSE   TRUE  FALSE
4  d n h dn  FALSE  FALSE  FALSE   TRUE
5  e o i eo  FALSE  FALSE  FALSE  FALSE
6  f p j fp  FALSE  FALSE  FALSE  FALSE
7  g q k gq  FALSE  FALSE  FALSE  FALSE
8  h r l hr  FALSE  FALSE  FALSE  FALSE
9  i s m is  FALSE  FALSE  FALSE  FALSE
10 j t n jt  FALSE  FALSE  FALSE  FALSE

我不确定测试data.frame是否涵盖了所有情况,但希望它可以满足您的期望。