如何在R语言的匿名函数中正确使用across函数?
解决across匿名函数写法报错问题
你之前的错误出在匿名函数的写法上:\(x) na.rm = TRUE只是返回了一个布尔值,但across需要的是能对列数据进行统计计算的函数,所以才会报“only Booleans”的错误。
正确的匿名函数写法
要在匿名函数里调用传入的统计函数(即.x),并把na.rm=TRUE作为参数传递给它,代码如下:
sum_df2 <- map_dfr(funs, ~ summarize(df, across(where(is.numeric), \(x) .x(x, na.rm = TRUE))), .id = "statistic" )
这里的\(x) .x(x, na.rm = TRUE)表示:对每一列x,执行当前迭代的统计函数(比如min、median),同时传入na.rm=TRUE参数处理缺失值。
更简洁的替代写法
如果你觉得匿名函数麻烦,也可以用purrr::partial来绑定参数,不用写匿名函数:
sum_df3 <- map_dfr(funs, ~ summarize(df, across(where(is.numeric), partial(.x, na.rm = TRUE))), .id = "statistic" )
partial(.x, na.rm = TRUE)会帮你预先把na.rm=TRUE绑定到统计函数.x上,效果和匿名函数完全一致。
验证结果
运行上述代码后,sum_df2或sum_df3的输出和你最初的sum_df1完全相同:
# A tibble: 5 × 3 statistic a b <chr> <dbl> <dbl> 1 min 0.288 0.0456 2 median 0.408 0.453 3 mean 0.543 0.498 4 max 0.940 0.902 5 sd 0.280 0.359
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

