如何使用Tidyverse按列计算2*min{x, 1-x}值
Tidyverse 实现逐列计算2*min(x, 1-x)的方案
测试数据与需求
首先构造测试数据集:
library(tidyverse) tibble(var1.q = 0.01, var2.q = .99, var3.q = .45) -> foo
需求为对数据集每一列计算2 * min(x, 1-x),已有的base R参考实现如下,可得到预期结果:
2*apply(bind_rows(foo, 1-foo), 2, FUN=min)
预期输出:
var1.q var2.q var3.q 0.02 0.02 0.90
Tidyverse 写法
最简洁的原生Tidyverse实现不需要拼接行,直接用dplyr的逐列操作语法即可:
foo %>% summarise(across( .cols = everything(), .fns = ~ 2 * pmin(.x, 1 - .x) ))
实现关键点:
- 用
across(everything())选中所有列执行统一运算,符合Tidyverse逐列操作的规范语法 - 用向量化函数
pmin()代替普通的min(),实现逐元素取最小值,避免min()只返回全局单值的问题
如果需要和base R输出格式一致的命名向量,可以在后面接unlist():
foo %>% summarise(across(everything(), ~ 2 * pmin(.x, 1 - .x))) %>% unlist()
运行后输出和预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Otto Kässi
相关产品推荐
相关产品推荐

