Проверка столбца R, содержит ли значение из другого столбца - PullRequest
1 голос
/ 29 апреля 2020

Есть ли способ в R проверить, содержит ли значение в одном столбце значение в другом столбце? В приведенном ниже примере я пытаюсь увидеть, содержатся ли значения в col2 в значениях в col1 (независимо в каждой строке), но получаю предупреждающее сообщение: "аргумент 'pattern' имеет длину> 1, и будет использоваться только первый элемент ». В столбце флага должно быть указано «Да» для первой / последней строки и «Нет» для 2-й и 3-й строк. Любые мысли о том, как решить, будет очень признателен.

col1 <- c("R.S.U.L.C","S.I.W","P.U.E","A.E.N")
col2 <- c("R","U","I","N")

df2 <- data.frame(col1,col2)

df2$Flag <- ifelse(grepl(df2$col2,df2$col1),"Yes","No")

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

df2$flag <- mapply(grepl, df2$col2, df2$col1)

grepl() аргумент шаблона использует только первый элемент:

См. ?grepl:

Если символьный вектор длина 2 или более, первый элемент используется с предупреждением.

2 голосов
/ 29 апреля 2020

Это можно сделать с помощью комбинации sapply/grepl. L oop вдоль df2$col и grepl в строке df$col1.
Однострочник очевиден.

i <- sapply(seq_along(df2$col2), function(i) grepl(df2$col2[i], df2$col1[i]))
df2$Flag <- c("No", "Yes")[i + 1L]
df2
#       col1 col2 Flag
#1 R.S.U.L.C    R  Yes
#2     S.I.W    U   No
#3     P.U.E    I   No
#4     A.E.N    N  Yes
0 голосов
/ 29 апреля 2020

Мы можем использовать str_detect, который векторизован как для шаблона, так и для строки

library(dplyr)
library(stringr)
df2 <- df2 %>% 
     mutate(Flag = c('No', 'Yes')[1+str_detect(col1, as.character(col2))])
df2
#       col1 col2 Flag
#1 R.S.U.L.C    R  Yes
#2     S.I.W    U   No
#3     P.U.E    I   No
#4     A.E.N    N  Yes
...