2014-09-18 48 views
1

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

我有这样的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,但这只是一个占位符,并且也不起作用。

在此先感谢!

+2

也许只是先用'mutate'改变'impression_number'?像mutate(impression_number = paste(“impression”,impression_number,sep =“_”))',然后链接到投射。 – aosmith 2014-09-18 21:24:06

+0

这绝对有效,但我正在寻找一种通用的方式来调用链中的现有对象。在不同的情况下,我遇到过这个问题,但最终意识到这是一个简单的例子,最终在这里展示。谢谢! – maloneypatr 2014-09-18 21:27:27

+0

当我尝试过滤出不完整的行时,我想调用该结构的另一个示例。通常,我使用'dat [complete.cases(dat),]',但我不能在'dplyr'链中使用它。 – maloneypatr 2014-09-19 13:59:05

回答

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]))) 
+0

这就是我正在寻找@aosmith!我知道这是可行的,但我还没有遇到“做”功能。再次感谢! – maloneypatr 2014-09-19 17:41:11