Создание новых переменных с преобразованием и%>%

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

Я могу создать переменную правильно, когда я пытаюсь с некоторыми "традиционными" вложенными функциями:

expand.grid(a=c(1000-500,1000,1000+500),
                       b=c(15,150)) %>%
  mutate(c=paste("foo", LETTERS[seq_along(a)],sep="_"))

##      a   b     c
## 1  500  15 foo_A
## 2 1000  15 foo_B
## 3 1500  15 foo_C
## 4  500 150 foo_D
## 5 1000 150 foo_E
## 6 1500 150 foo_F

Тогда я решил попробовать %>% от magrittr а также dplyr

expand.grid(a=c(1000-500,1000,1000+500),
                       b=c(15,150)) %>%
  mutate(c=paste("foo", a %>% 
                   seq_along %>% 
                   LETTERS[.],sep="_"))

## Error: incorrect number of dimensions

Это также не работает, когда я добавляю псевдоним экстракт ([) функция от magrittr:

expand.grid(a=c(1000-500,1000,1000+500),
                       b=c(15,150)) %>%
  mutate(c=paste("foo", a %>% 
                   seq_along %>% 
                   extract(LETTERS,.),
                 sep="_"))

## Error: incorrect number of dimensions

Я попытался отладить трубу с debug_pipe но безрезультатно. Буду очень признателен за любые идеи!

2 ответа

Решение

Ты можешь, если ты хочешь:

expand.grid(a=1000+c(-500, 0, 500), b=c(15,150)) %>%
mutate(c = a %>% seq_along %>% LETTERS[.] %>% paste0("foo_", .))

Если мы определим вспомогательную функцию Swap тогда это можно сделать без использования. как это:

library(dplyr)
library(magrittr)

Swap <- function(f) function(x, y, ...) f(y, x, ...)

expand.grid(a=1000+c(-500, 0, 500), b=c(15,150)) %>%
  mutate(c = a %>% 
             seq_along %>% 
             Swap(extract)(LETTERS) %>% 
             Swap(paste0)("foo_"))
Другие вопросы по тегам