我想为下面的嵌套函数调用创建一个magrittr
管链产生完全相同的输出。
下面返回一个数据框,其中包含列 my_names
和 Freq
列。
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 = .)
有没有办法告诉%>%
在后续调用中将.
解释为变量名而不是占位符?
非常非常晚的,但是您可以使用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
评论中建议的解决方案只工作了几天。
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'))