如何使用mutate按分组从其他列的最值创建新列?
解决方案
首先构造示例数据集:
library(dplyr) df <- tibble( A = c(1,5,NA,NA,NA), B = c(NA,NA,10,11,13) )
你可以通过mutate结合which.max、which.min和case_when实现需求,代码如下:
df <- df %>% mutate( C = case_when( # 匹配A列最大值所在行,取对应A值 row_number() == which.max(A) ~ A, # 匹配B列最小值所在行,取对应B值 row_number() == which.min(B) ~ B, # 其余行设为NA TRUE ~ NA_real_ ) )
说明
which.max(A)返回A列中第一个最大值的行号(此处A的最大值为5,对应第2行);which.min(B)返回B列中第一个最小值的行号(此处B的最小值为10,对应第3行)。row_number()标记当前行位置,匹配到目标行时赋值对应列的值,其余行用NA_real_确保数值型列的类型一致性,避免警告。
执行后得到的数据集:
# A tibble: 5 × 3 A B C <dbl> <dbl> <dbl> 1 1 NA NA 2 5 NA 5 3 NA 10 10 4 NA 11 NA 5 NA 13 NA
如果需要处理多组最大值/最小值的情况(比如A列存在多个相同最大值),可调整判断条件:
df <- df %>% mutate( max_A = max(A, na.rm = TRUE), min_B = min(B, na.rm = TRUE), C = case_when( A == max_A ~ A, B == min_B ~ B, TRUE ~ NA_real_ ) ) %>% select(-max_A, -min_B)
内容的提问来源于stack exchange,提问作者hks
相关产品推荐
相关产品推荐

