Использование `: =` из rlang для назначения имен столбцов с использованием входных данных функции lapply - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь провести l oop по вектору шаблонов / строк, чтобы обе строки соответствовали другому столбцу, и назначить результаты столбцу с тем же именем, что и шаблон, по которому выполняется поиск. Простой пример ниже.

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

> library(rlang)
> library(stringr)
> library(dplyr)
> set.seed(5)
> df <- data.frame(
+   groupA = sample(x = LETTERS[1:6], size = 20, replace = TRUE),
+   id_col = 1:20
+ )
> 
> mycols <- c('A','C','D')
> 
> dfmatches <- 
+   lapply(mycols, function(icol) {
+   data.frame(!!icol := grepl(pattern = icol, x = df$groupA))
+ }) %>% 
+   cbind.data.frame()

Это дает мне ошибку:

 Error: `:=` can only be used within a quasiquoted argument

Желаемый вывод будет data.frame, как показано ниже:

> dfmatches
       A     C     D
1  FALSE FALSE FALSE
2  FALSE FALSE FALSE
3  FALSE FALSE FALSE
4  FALSE FALSE FALSE
5   TRUE FALSE FALSE
6  FALSE FALSE FALSE
7  FALSE FALSE  TRUE
8  FALSE FALSE FALSE
9  FALSE FALSE FALSE
10  TRUE FALSE FALSE
11 FALSE FALSE FALSE
12 FALSE  TRUE FALSE
13 FALSE FALSE FALSE
14 FALSE FALSE  TRUE
15 FALSE FALSE FALSE
16 FALSE FALSE FALSE
17 FALSE  TRUE FALSE
18 FALSE FALSE FALSE
19 FALSE FALSE  TRUE
20 FALSE FALSE FALSE

Я пытался множественные варианты, использующие {{}} или !! rlang::sym() et c, но не могут понять правильный синтаксис для этого.

1 Ответ

2 голосов
/ 27 января 2020

Один из вариантов - использовать map_dfc из purrr. Также я думаю, что вам не нужно grepl, так как здесь мы ищем точное совпадение, а не частичное.

library(dplyr)
library(purrr)

map_dfc(mycols, ~df %>% transmute(!!.x := groupA == .x))

В базе R мы можем сделать

setNames(do.call(cbind.data.frame, lapply(mycols, 
                 function(x) df$groupA == x)), mycols)
...