我收到dplyr::bind_rows
错误。这是一个非常微不足道的问题,因为我可以轻松解决它,但我想了解错误信息的含义。
我有新英格兰州的一些人口群体的以下数据,我想绑定这些相同值的副本,名称更改为“新英格兰”,以便我可以按名称分组并添加他们,给我个别州的价值,加上该地区的整体价值。
df <- structure(list(name = c("CT", "MA", "ME", "NH", "RI", "VT"),
estimate = c(501074, 1057316, 47369, 76630, 141206, 27464)),
class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
我这样做是为了更大的管道步骤流程的一部分,所以我不能只做bind_rows(df, df %>% mutate(name = "New England"))
。 dplyr
为从一个函数传递到下一个函数的数据框提供了方便的.
简写,但我不能用它以我想要的方式将数据框绑定到自身。< / p>
做什么工作并获得我想要的输出:
library(tidyverse)
df %>%
# arbitrary piped operation
mutate(name = str_to_lower(name)) %>%
bind_rows(mutate(., name = "New England")) %>%
group_by(name) %>%
summarise(estimate = sum(estimate))
#> # A tibble: 7 x 2
#> name estimate
#> <chr> <dbl>
#> 1 ct 501074
#> 2 ma 1057316
#> 3 me 47369
#> 4 New England 1851059
#> 5 nh 76630
#> 6 ri 141206
#> 7 vt 27464
但是当我尝试使用.
简写做同样的事情时,我收到了这个错误:
df %>%
mutate(name = str_to_lower(name)) %>%
bind_rows(. %>% mutate(name = "New England"))
#> Error in bind_rows_(x, .id): Argument 2 must be a data frame or a named atomic vector, not a fseq/function
就像我说的那样,第一种方式做得很好,但是我想了解错误,因为我写了很多多步管道代码。
答案 0 :(得分:3)
正如@aosmith在评论中指出的那样,由于magrittr
在这种情况下解析点的方式:
来自?'%>%'
:
使用点占位符作为lhs
当点用作lhs时, 结果将是一个功能序列,即适用的功能 整个右侧的链条依次为其输入。
为避免触发此操作,lhs上表达式的任何修改都将执行:
df %>%
mutate(name = str_to_lower(name)) %>%
bind_rows((.) %>% mutate(name = "New England"))
df %>%
mutate(name = str_to_lower(name)) %>%
bind_rows({.} %>% mutate(name = "New England"))
df %>%
mutate(name = str_to_lower(name)) %>%
bind_rows(identity(.) %>% mutate(name = "New England"))
这是一个完全避免这个问题的建议:
df %>%
# arbitrary piped operation
mutate(name = str_to_lower(name)) %>%
replicate(2,.,simplify = FALSE) %>%
map_at(2,mutate_at,"name",~"New England") %>%
bind_rows
# # A tibble: 12 x 2
# name estimate
# <chr> <dbl>
# 1 ct 501074
# 2 ma 1057316
# 3 me 47369
# 4 nh 76630
# 5 ri 141206
# 6 vt 27464
# 7 New England 501074
# 8 New England 1057316
# 9 New England 47369
# 10 New England 76630
# 11 New England 141206
# 12 New England 27464