Определите, найдено ли какое-либо значение из вектора в R в другом векторе - PullRequest
1 голос
/ 03 августа 2020

У меня есть фрейм данных с двумя столбцами: a и b. Оба a и b имеют векторы разной длины, и я хочу создать еще один столбец с именем boolean, который должен быть истинным, если хотя бы одно значение из вектора в b присутствует в векторе в столбце a. Однако я использовал следующие logi c и получаю false для всех строк, хотя я должен получить true для строк 1, 3 и 4. Воспроизводимый пример моей попытки выглядит следующим образом:

library(tidyverse)
library(tibble)
data_frame <-
  tribble(
    ~a,                                    ~b,
    c("50", "50", "50", "3"),              c("1", "2", "3"),
    c("17", "50", "50", "50"),             "19",
    c("50", "28", "50", "3"),              c("30", "28", "29"),
    c("21", "19", "50", "50", "50"),       c("19", "20", "18")
  )

data_frame %>% 
  mutate(
    boolean = if_else(
      any(b %in% a),
      "yes",
      "no"
    )
  )
#> # A tibble: 4 x 3
#>   a         b         boolean
#>   <list>    <list>    <chr>  
#> 1 <chr [4]> <chr [3]> no     
#> 2 <chr [4]> <chr [1]> no     
#> 3 <chr [4]> <chr [3]> no     
#> 4 <chr [5]> <chr [3]> no

Что-то не так с тем, как я использую команду any? Спасибо.

Ответы [ 5 ]

3 голосов
/ 03 августа 2020

Базовый вариант R с использованием Vectorize + intersect

within(data_frame,  boolean <- ifelse(lengths(Vectorize(intersect)(a,b)),"yes","no"))

или Map + intersect

within(data_frame,  boolean <- ifelse(lengths(Map(intersect,a,b)),"yes","no"))

, что дает

# A tibble: 4 x 3
  a         b         boolean
  <list>    <list>    <chr>
1 <chr [4]> <chr [3]> yes
2 <chr [4]> <chr [1]> no
3 <chr [4]> <chr [3]> yes
4 <chr [5]> <chr [3]> yes
2 голосов
/ 03 августа 2020

A purrr решение с map2():

library(dplyr)
library(purrr)

data_frame %>%
  mutate(boolean = map2_chr(a, b, ~ if_else(any(.y %in% .x), "yes", "no")))

# # A tibble: 4 x 3
#   a         b         boolean
#   <list>    <list>    <chr>  
# 1 <chr [4]> <chr [3]> yes    
# 2 <chr [4]> <chr [1]> no     
# 3 <chr [4]> <chr [3]> yes    
# 4 <chr [5]> <chr [3]> yes    

или с pmap():

data_frame %>%
  mutate(boolean = pmap_chr(select(., a, b),
                            ~ if_else(any(.y %in% .x), "yes", "no")))
2 голосов
/ 03 августа 2020

Добавьте rowwise, чтобы выполнить эту операцию с каждой строкой:

library(dplyr)

data_frame %>% 
   rowwise() %>%
   mutate(boolean = if_else(any(b %in% a),"yes","no"))

#   a         b       boolean
#  <list>    <list>    <chr>  
#1 <chr [4]> <chr [3]> yes    
#2 <chr [4]> <chr [1]> no     
#3 <chr [4]> <chr [3]> yes    
#4 <chr [5]> <chr [3]> yes    

Похожие варианты:

Без ifelse:

library(dplyr)
library(purrr)

data_frame %>% 
  rowwise() %>%
  mutate(boolean = c('no', 'yes')[any(b %in% a) + 1])

Или с map2_lgl:

data_frame %>% 
     mutate(boolean = c('no', 'yes')[map2_lgl(b, a, ~any(.x %in% .y)) + 1])
0 голосов
/ 03 августа 2020

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

library(dplyr)
library(purrr)
data_frame %>% 
   mutate(boolean = pmap_chr(., ~  c("no", "yes")[1+any(..2 %in% ..1)]))
# A tibble: 4 x 3
#  a         b         boolean
#  <list>    <list>    <chr>  
#1 <chr [4]> <chr [3]> yes    
#2 <chr [4]> <chr [1]> no     
#3 <chr [4]> <chr [3]> yes    
#4 <chr [5]> <chr [3]> yes    
0 голосов
/ 03 августа 2020

Вы после этого?

data_frame %>%
  rowwise() %>%
  mutate(boolean = if_else(any(b %in% a), "yes", "no"))

# A tibble: 4 x 3
# Rowwise: 
  a         b         boolean
  <list>    <list>    <chr>  
1 <chr [4]> <chr [3]> yes    
2 <chr [4]> <chr [1]> no     
3 <chr [4]> <chr [3]> yes    
4 <chr [5]> <chr [3]> yes 
...