Создать новый столбец на основе сопоставленной строки в другом столбце, используя функцию grep - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь использовать функцию grep для создания нового столбца на основе сопоставленной строки (без совпадения = 0, совпадения = 1), но не получаю ожидаемых результатов

#my data
data<- data.frame(col1 = c("name","no_match","123","0.19","rand?m","also_no_match"))

#string to match
match_txt <- "[0-9]\\.[0-9][0-9]|name|name2|wh??|[0-9]|\\?"  #used "|" to match multiple strings

#create the new column using for loop
for (i in 1:nrow(data))
  {
data$col2[i] <- grep(match_txt , data$col1[i])
}

# I get the error below:
# Error in data$col2[i] <- grep(match_txt, data$col1[i],  ignore.case = TRUE) : replacement has length zero

#this is expected correct results:
expected_data <- data.frame(col1 = c("name","no_match","123","0.19","rand?m","also_no_match"),
                            col2 = c(1,0,1,1,1,0))

1 Ответ

3 голосов
/ 02 октября 2019

grep / grepl векторизованы. Мы можем напрямую использовать их в столбце с шаблоном, просто поместив его в as.integer, чтобы преобразовать логические значения TRUE / FALSE в 1/0 соответственно.

data$col2 <- as.integer(grepl("[0-9]\\.[0-9][0-9]|name|name2|wh??|[0-9]|\\?", data$col1))
data
#           col1 col2
#1          name    1
#2      no_match    0
#3           123    1
#4          0.19    1
#5        rand?m    1
#6 also_no_match    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...