我想在投射后重命名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
,但这只是一个占位符,也没有用。
提前致谢!
答案 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])))