在dplyr链中调用data.frame

时间:2014-09-18 20:36:03

标签: r dplyr

我想在投射后重命名dplyr链中的一些列。但是,我不知道如何在rename.vars函数中调用当前结构的名称。

我有这个data.frame:

library(gdata)
library(dplyr)
library(reshape2)

dat <- structure(list(user = c(1101L, 1102L, 1103L, 1104L, 1105L, 1101L, 
                        1102L, 1103L, 1104L, 1105L, 1101L, 1102L, 1103L, 1104L, 1105L, 
                        1101L, 1102L, 1103L, 1104L, 1105L), campaign = structure(c(1L, 
                                                                                   2L, 1L, 2L, 3L, 3L, 4L, 5L, 2L, 1L, 1L, 3L, 3L, 2L, 3L, 2L, 1L, 
                                                                                   4L, 3L, 2L), .Label = c("A", "B", "C", "D", "E"), class = "factor"), 
               impression_number = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                                     2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L)), .Names = c("user", 
                                                                                              "campaign", "impression_number"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                    -20L))

看起来像这样:

   user campaign impression_number
1  1101        A                 1
2  1102        B                 1
3  1103        A                 1
4  1104        B                 1
5  1105        C                 1
6  1101        C                 2

当我尝试运行以下命令时,它会出错,因为我没有引用当前对象的名称:

dat %>%
  dcast(user ~ impression_number, value.var = 'campaign') %>%
  rename.vars(names(.)[2:5], paste0('impression_', names(.)[2:5]))

理想情况下,我想要这个数据框:

             user  impression_1  impression_2  impression_3  impression_4
1            1101             A             C             A             B
2            1102             B             D             C             A
3            1103             A             E             C             D
4            1104             B             B             B             C
5            1105             C             A             C             B

如何引用当前对象的名称?我也从文档中尝试了lhs,但这只是一个占位符,也没有用。

提前致谢!

1 个答案:

答案 0 :(得分:4)

我认为这是do所针对的事情之一。在do之前,你会编写一个匿名函数。 This answer提供了一个很好的示例,说明如何使用complete.cases(您在后续评论中提到),包括匿名函数和do

对于重命名,您只需将rename.vars放在do内并使用.来引用数据集。

dat %>%
  dcast(user ~ impression_number, value.var = 'campaign') %>%
  do(rename.vars(., names(.)[2:5], paste0('impression_', names(.)[2:5])))