如何解释"。"作为变量而不是使用magrittr的前向管道运算符的占位符

时间:2014-12-26 16:13:04

标签: r dplyr magrittr

我想为下面的嵌套函数调用创建一个magrittr管道链 它产生完全相同的输出。

以下内容返回包含my_namesFreq列的数据框。

my_names <- c('John', 'Joe', 'Jane', 'John', 'John', 'Jane')

test_df <- as.data.frame.table(sort(table(my_names), decreasing = TRUE))

   my_names Freq
1     John    3
2     Jane    2
3      Joe    1

使用magrittr管道链返回包含.列和Freq

列的数据框
library(magrittr)

test_df <- my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table 

   . Freq
1 John    3
2 Jane    2
3  Joe    1

添加%>% dplyr::rename(my_names = .)将无效,因为.被解释为占位符 而不是列名。

要产生与嵌套函数调用相同的输出,我需要使用额外的函数调用:test_df <- dplyr::rename(test_df, my_names = .)

有没有办法告诉%>%.解释为变量名,而不是后续调用中的占位符?

2 个答案:

答案 0 :(得分:0)

@ aosmith @在评论中提出的解决方案仅工作了几天。

dplyr的最新开发版0.4还会生成一个包含.列的数据框:

devtools::install_github("hadley/lazyeval")
devtools::install_github("hadley/dplyr")
library(dplyr)

my_names <- c('John', 'Joe', 'Jane', 'John', 'John', 'Jane')

my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table

. Freq
1 John    3
2 Jane    2
3  Joe    1

我现在的解决方案现在看起来如下,并在之前的docendo discimus中提出:

my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table %>%
  setNames(c('my_names', 'Freq'))

答案 1 :(得分:0)

这是非常非常晚的,但您可以使用rename_版本(带下划线)和字符串 "."。这避免了非标准评估,因此可以%>%代替.

test_df <- my_names %>% table %>% sort(decreasing = TRUE) %>% as.data.frame.table %>%
    rename_(my_names=".")

#  my_names Freq
#1     John    3
#2     Jane    2
#3      Joe    1