使用transform和%>%创建新变量

时间:2014-05-17 20:18:55

标签: r dplyr magrittr

我试图使用"管状"运算符根据LETTERS向量创建一个与数据框中其他变量长度相同的新变量。出了点问题,我对magrittr来说太新了,不能诊断问题。

当我尝试使用#34;传统的"时,我能够正确地创建变量。嵌套函数:

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 个答案:

答案 0 :(得分:4)

如果你愿意,你可以:

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

答案 1 :(得分:3)

如果我们定义一个辅助函数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_"))