如何在Tidyverse框架下找出tibble所有字符串列的全局最小值?
问题:在Tidyverse框架下求tibble所有列的全局最小值
给定如下tibble:
library(tibble) t <- tibble( x = c("a", "b", "c"), y = c("d", "e", "f"), z = c("g", "h", "i") )
想要找出所有列中所有值的最小值,但直接调用min(t)会报错:
Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric-alike variables
目前只能通过手动拼接向量的方式实现(如min(c(t$x, t$y, t$z))),但列数较多时扩展性差。注:假设min对字符串的处理结果符合预期。
最优实现方式
方法1:宽表转长表后计算(最贴合Tidyverse理念)
通过tidyr::pivot_longer将所有列合并为单一值列,再提取向量计算最小值,逻辑清晰、可读性强,还能方便扩展到分组计算等场景:
library(dplyr) library(tidyr) t_min <- t %>% pivot_longer(cols = everything(), values_to = "value") %>% pull(value) %>% min() # 输出结果:"a"
方法2:函数式迭代求最小值
利用purrr::reduce迭代处理每一列,逐步将列与当前最小值比较,最终得到全局最小值,适合偏好函数式编程的场景:
library(purrr) t_min <- t %>% reduce(min) # 输出结果:"a"
方法3:扁平化数据后计算(最简洁)
直接将tibble扁平化为原子向量,再调用min,代码简洁高效:
t_min <- t %>% unlist() %>% min() # 输出结果:"a"
内容的提问来源于stack exchange,提问作者dddm
相关产品推荐
相关产品推荐

