我正在尝试创建一个标志,以确定某个代码是否出现在数据集的给定行中的任何单元格中。它必须是完全匹配 - 换句话说,如果我正在寻找'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)))
}
我正在尝试为每个有问题的值创建一堆标志列。
有什么建议吗?
答案 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
是否涵盖了所有情况,但希望它可以满足您的期望。