purrr: использование% in% со списком-столбцом - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть столбец вопроса response с и столбец возможных correct_answers. Я хотел бы создать третий (логический) столбец (correct), чтобы показать, соответствует ли ответ одному из возможных правильных ответов.

Я думаю, что мне может понадобиться использовать функцию purrr, но я не уверен, например, как использовать одну из map функций с %in%.

library(tibble)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(purrr)

data <- tibble(
  response = c('a', 'b', 'c'),
  correct_answers = rep(list(c('a', 'b')), 3)
)

# works but correct answers specified manually
data %>%
  mutate(correct = response %in% c('a', 'b'))
#> # A tibble: 3 x 3
#>   response correct_answers correct
#>   <chr>    <list>          <lgl>  
#> 1 a        <chr [2]>       TRUE   
#> 2 b        <chr [2]>       TRUE   
#> 3 c        <chr [2]>       FALSE

# doesn't work
data %>%
  mutate(correct = response %in% correct_answers)
#> # A tibble: 3 x 3
#>   response correct_answers correct
#>   <chr>    <list>          <lgl>  
#> 1 a        <chr [2]>       FALSE  
#> 2 b        <chr [2]>       FALSE  
#> 3 c        <chr [2]>       FALSE

Создано в 2018-11-05 пакетом представительство (v0.2.1)

1 Ответ

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

%in% не проверяет вложенные элементы в списке, используйте mapply (baseR) или map2 (purrr) для циклического просмотра столбцов и проверки:

data %>% mutate(correct = mapply(function (res, ans) res %in% ans, response, correct_answers))
# A tibble: 3 x 3
#  response correct_answers correct
#  <chr>    <list>          <lgl>  
#1 a        <chr [2]>       TRUE   
#2 b        <chr [2]>       TRUE   
#3 c        <chr [2]>       FALSE  

Использование map2_lgl:

library(purrr)
data %>% mutate(correct = map2_lgl(response, correct_answers, ~ .x %in% .y))
# A tibble: 3 x 3
#  response correct_answers correct
#  <chr>    <list>          <lgl>  
#1 a        <chr [2]>       TRUE   
#2 b        <chr [2]>       TRUE   
#3 c        <chr [2]>       FALSE 

Или, как прокомментировал @thelatemail, оба могут быть упрощены:

data %>% mutate(correct = mapply(`%in%`, response, correct_answers)) 
data %>% mutate(correct = map2_lgl(response, correct_answers, `%in%`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...