Как мне сопоставить вектор символов со списком векторов символов в таблице в R? - PullRequest
0 голосов
/ 06 ноября 2018

Я бы хотел сравнить столбец A в столбце с столбцом B, чтобы увидеть, присутствует ли элемент в столбце A в столбце B. Столбец A является символьным вектором. Столбец B представляет собой список векторов символов. Я хотел бы сделать это построчно. Я могу сделать это с помощью цикла.

library(tidyverse)

my.tibble = c('a','b','c') %>% tibble
my.list = list(c('a','b'),c('b','c'),c('d','e'))
my.tibble = my.tibble %>% add_column(my.list)

its.in.it = as.list(NULL)
for (i in 1:nrow(my.tibble)){
    its.in.it[[i]] = my.tibble[i,1] %in% unlist(my.tibble[i,2])
}

my.tibble$its.in.it = unlist(its.in.it)
my.tibble

Я пытаюсь сделать это с помощью dplyr / purrr или apply. Я не уверен, стоит ли мне группировать, гнездить или разбивать, и комбинаций много.

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

есть также версия приложения dplyr.

my.tibble %>% mutate(its.in.it = . %in% unlist(my.tibble$my.list))

0 голосов
/ 06 ноября 2018

Вы можете использовать map2_lgl, который принимает два входа, проходит через них и возвращает логический вектор.

names(my.tibble) <- c("char", "char.list")
my.tibble %>% 
  mutate(its.in.it = map2_lgl(char, char.list, ~ .x %in% .y))

# A tibble: 3 x 3
#   char  char.list its.in.it
#   <chr> <list>    <lgl>    
# 1 a     <chr [2]> TRUE     
# 2 b     <chr [2]> TRUE     
# 3 c     <chr [2]> FALSE  
0 голосов
/ 06 ноября 2018

С apply было бы так:

apply(my.tibble, 1, function(x) x[1] %in% unlist(x[2]))
#[1]  TRUE  TRUE FALSE

my.tibble$its.in.it <- apply(my.tibble, 1, function(x) x[1] %in% unlist(x[2]))
0 голосов
/ 06 ноября 2018

Мы можем использовать rowwise

library(tidyverse)
names(my.tibble) <- LETTERS[1:2]
my.tibble %>% 
   rowwise() %>%
   mutate(itsinit = A  %in% unlist(B))
# A tibble: 3 x 3
#  A     B         itsinit
#  <chr> <list>    <lgl>  
#1 a     <chr [2]> TRUE   
#2 b     <chr [2]> TRUE   
#3 c     <chr [2]> FALSE  

ПРИМЕЧАНИЕ: метод @ kath с map2 будет быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...