Поиск в строке символов со списком строк и возвращаемое совпадение - PullRequest
0 голосов
/ 05 мая 2018

В R я хотел бы сделать, как говорится в названии. Искать в столбце символов и возвращать подходящее слово

As.data.frame(
    c("yellow carrot","big car","green tomato","orange car","fertile goat","red snapper")
    )

А

c("yellow","red","orange","green","blue")

Я бы хотел вернуться

As.data.frame(
    cbind(
        c("yellow carrot","big car","green tomato","orange car","fertile goat","red snapper"),
        c("yellow","NA","green","orange","NA","red")
        )

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

С dplyr и ifelse инструкциями, и работает, если цвет не находится в начале строки.

data.frame(
    vary_1 = c(
        "yellow carrot",
        "big car",
        "green tomato",
        "orange car",
        "fertile goat",
        "red snapper"
    )
) %>%
    mutate(new = ifelse(grepl('yellow', .$vary_1),'yellow',
        ifelse(grepl('green', .$vary_1),'green',
            ifelse(grepl('red', .$vary_1),'red',
                   ifelse(grepl('orange',.$vary_1),'orange',
            NA
        )))))
    )

         vary_1    new
1 yellow carrot yellow
2       big car   <NA>
3  green tomato  green
4    orange car orange
5  fertile goat   <NA>
6   red snapper    red
0 голосов
/ 05 мая 2018

Базовое решение R с использованием grepl:

# Sample data
df <- data.frame(V1 = c("yellow carrot","big car","green tomato","orange car","fertile goat","red snapper"))
s <- c("yellow","red","orange","green","blue")

df$new <- apply(df, 1, function(x)
    ifelse(length(ret <- s[sapply(s, function(y) grepl(y, x))]) > 0, ret, NA))
df;
#             V1    new
#1 yellow carrot yellow
#2       big car   <NA>
#3  green tomato  green
#4    orange car orange
#5  fertile goat   <NA>
#6   red snapper    red
0 голосов
/ 05 мая 2018

Мы можем использовать str_extract, чтобы получить соответствующую подстроку

library(stringr)
df1$new <- str_extract(df1[[1]], paste(vec1, collapse="|")) 
df1$new
#[1] "yellow" NA       "green"  "orange" NA       "red"   

данные

vec1 <- c("yellow","red","orange","green","blue")
df1 <- data.frame(col1 = c("yellow carrot","big car",
  "green tomato","orange car","fertile goat","red snapper"))
...