R语言新原生管道|>失效问题及解决方案咨询
原生管道
|>替代%>%时的报错解决方法 问题场景
需要合并两个dataframe,按No列分组后对其余所有列计算求和值。使用dplyr的旧管道%>%可以正常运行,但切换到R原生管道|>时出现报错。
可复现数据
df1 <- structure(list(No = 1:3, A = c(1L, 0L, 0L), B = c(0L, 1L, 0L), C = c(1L, 2L, 1L), D = c(0L, 1L, 0L)), class = "data.frame", row.names = c(NA, -3L)) df2 <- structure(list(No = 1:3, A = c(1L, 0L, 2L), B = c(0L, 1L, 1L), E = c(1L, 2L, 1L), F = c(1L, 1L, 0L)), class = "data.frame", row.names = c(NA, -3L))
旧管道%>%正常运行代码及结果
library(tidyverse) bind_rows(df1, df2) %>% group_by(No) %>% summarise(across(colnames(.)[-1], sum, na.rm = TRUE), .groups = "drop") # 输出结果: # A tibble: 3 x 7 # No A B C D E F # <int> <int> <int> <int> <int> <int> <int> # 1 1 2 0 1 0 1 1 # 2 2 0 2 2 1 2 1 # 3 3 2 1 1 0 1 0
原生管道|>报错信息
Error in `summarise()`: i In argument: `across(colnames(.)[-1], sum, na.rm = TRUE)`. i In group 1: `No = 1`. Caused by error in `across()`: ! Problem while evaluating `colnames(.)[-1]`. Caused by error in `is.data.frame()`: ! object '.' not found
解决方法
报错核心原因是:原生管道|>的.仅在顶层表达式中有效,无法在嵌套函数(比如across内部)中识别;而%>%会将.传递到所有嵌套层级。以下是几种可行的解决方式:
方法1:使用tidyselect语法直接指定列
利用dplyr的列选择语法,直接排除No列,无需依赖.:
bind_rows(df1, df2) |> group_by(No) |> summarise(across(-No, sum, na.rm = TRUE), .groups = "drop")
如果需要更明确的选择逻辑,也可以用everything()配合排除:
bind_rows(df1, df2) |> group_by(No) |> summarise(across(everything(), sum, na.rm = TRUE, .cols = -No), .groups = "drop")
方法2:提前保存列名到变量
先获取合并后数据的列名,再在across中引用:
combined_cols <- colnames(bind_rows(df1, df2))[-1] bind_rows(df1, df2) |> group_by(No) |> summarise(across(all_of(combined_cols), sum, na.rm = TRUE), .groups = "drop")
方法3:用匿名函数包裹传递数据
通过匿名函数将数据赋值给临时变量x,在嵌套函数中直接引用x:
bind_rows(df1, df2) |> \(x) x |> group_by(No) |> summarise(across(colnames(x)[-1], sum, na.rm = TRUE), .groups = "drop")
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

