如何在R的dplyr中提取每行跨列的最大值?
解决dplyr中逐行提取多列最大值的问题
你之前的代码失败是因为col1:coln无法直接传递给max()函数,需要用dplyr专门的函数来按行提取列值。下面提供两种可行的方案:
方案1:rowwise() + c_across()
这是最直观的按行处理方式,适合理解逻辑:
library(tidyverse) set.seed(123) df <- tibble(id=seq(1:5), col1=runif(5,100,1000), col2=runif(5,100,1000),coln=runif(5,200,1000)) df %>% rowwise() %>% mutate(max = max(c_across(col1:coln))) %>% ungroup() # 取消行分组,避免后续操作性能下降
c_across(col1:coln)会在每行中提取col1到coln范围的所有列值,转换成向量后再用max()计算每行的最大值。
方案2:pmax() + across()(推荐大型数据集)
如果你的数据框很大,rowwise()的性能会比较差,推荐用向量化的pmax()函数,不需要行分组:
df %>% mutate(max = pmax(across(col1:coln), na.rm = TRUE))
across(col1:coln)会选中目标列,pmax()会逐行计算这些列的最大值,na.rm=TRUE用于处理可能存在的缺失值(如果你的数据没有缺失值也可以省略,但加上更稳妥)。
运行上述任意代码后,都会得到你想要的结果:
#> # A tibble: 5 × 5 #> id col1 col2 coln max #> <int> <dbl> <dbl> <dbl> <dbl> #> 1 1 359. 141. 965. 965. #> 2 2 809. 575. 563. 809. #> 3 3 468. 903. 742. 903. #> 4 4 895. 596. 658. 895. #> 5 5 946. 511. 282. 946.
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

