2016-01-13 3 views
1

У меня есть следующий dataframe:IfElse заявление на основе grepl

address <- c("Weg", "Laan", "Molenweg") 
b <- seq(1:3) 
df <- data.frame(address, b) 

То, что я хотел бы сделать сейчас, когда я вижу, содержит ли адрес определенное слово, а затем обозначить столбец. Так как это:

df_weg <- df$address 
x <- c("weg") 
df$test <- ifelse(grepl(x, df_weg), 1, 0) 

Это прекрасно работает, но им ищет способ пометить элемент как 0/1, когда слово в списке. Так оно и должно работать так:

x <- c("weg", "laan") 
df$test <- ifelse(grepl(x, df_weg), 1, 0) 

Но когда я пытаюсь это я получаю следующее сообщение об ошибке:

Warning message: 
In grepl(x, df_weg) : 
argument 'pattern' has length > 1 and only the first element will be used 

Есть thougts о том, как я могу получить эту работу?

ответ

4

Вы можете попробовать следующее выражение:

x <- "weg|laan" # or paste(c("weg", "laan"), collapse="|") 
df$test <- ifelse(grepl(x, df_weg), 1, 0) 

| через regex средство "или"

В более прямой путь, благодаря @DavidArenburg, как вам нужно 0/1 выход, вы можете просто преобразовать логический результат grepl к целочисленным:

as.integer(grepl("weg|laan", df_weg)) 

или, если вы хотите сделать codegolfing (но менее хороший pratice):

+grepl("weg|laan", df_weg) 
+6

Не можем ли мы просто 'as.integer (grepl (" weg laan ", df_weg))'? Или '+' унарный оператор, чтобы разозлить Конрада? –

+3

@David Приятно думать, что я принимаю это лично. Но на самом деле я просто жалуюсь на плохой код. –

+4

@ KonradRudolph, что мгновенная реакция вашего почти сделанного падения стула. Человек, ты потрясающий. –

Смежные вопросы