Grepl第一个字母,两个模式匹配

时间:2015-03-09 13:30:39

标签: r grepl

我有以下数据框。我想创建一个名为A1B1的列,如果在数据框中有以A1或B1开头或两者的字符串,则为1,如果没有,则为零。

我在这里做错了什么:

set.seed(1)
Data <- data.frame(id = seq(1, 10), 
Diag1 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
Diag2 = sample(c("D123", "E123", "F123"), 10, replace = TRUE), 
Diag3 = sample(c("G123", "H123", "I123"), 10, replace = TRUE), 
Diag4 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
Diag5 = sample(c("J123", "K123", "L123"), 10, replace = TRUE), 
Diag6 = sample(c("M123", "N123", "O123"), 10, replace = TRUE), 
Diag7 = sample(c("P123", "Q123", "R123"), 10, replace = TRUE))

A1orB1 <- c("^A1", "^B1")

Data$A1B1 <- apply(Data[-1],1,function(x)as.integer(sum(grepl(paste(A1orB1,collapse="|"), x))==1))

我希望有一个ID(1,2,3,4,5,8,9,10),但我只有4,5和9。

谢谢!

1 个答案:

答案 0 :(得分:3)

目前,您正在计算A1...B1...字符串数量的总和,并将其与1进行比较。

或许将sum()替换为any()(并考虑将代码分解为更多的中间块以使其更具可读性......)。或者您可以在代码中将==1替换为>=1

ss <- paste(A1orB1,collapse="|")
ff <- function(x) as.integer(any(grepl(ss,x)))
Data$A1B1 <- apply(Data[-1],1,ff)