Первые буквы Grepl, два шаблона для соответствия

У меня есть следующий кадр данных. Я хочу создать столбец с именем A1B1 с 1, если во фрейме данных есть строки, начинающиеся с A1 или B1, или и с тем, и с нулем, если нет.

Что я делаю неправильно здесь:

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

Я бы ожидал иметь один с идентификаторами (1,2,3,4,5,8,9,10), но у меня есть только те, что в 4,5 и 9.

Спасибо!


person Roccer    schedule 09.03.2015    source источник


Ответы (1)


В настоящее время вы вычисляете сумму количества строк 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)
person Ben Bolker    schedule 09.03.2015