如何在R中保留指定列值为该行最小值的行(含日期列与NA)
在R中筛选保留列B为该行最小值的行
问题说明
数据集共50列,其中48列为Y/m/d h:m:s格式,包含大量NA且不可删除。需要保留列B的值为该行最小值的行,删除不符合条件的行。
示例数据
df <- data.frame( A = c(11,19,17,6,13), B = c(18,9,5,16,12), C = c(14,15,8,87,16))
原始数据输出:
A B C 1 11 18 14 2 19 9 15 3 17 5 8 4 6 16 87 5 13 12 16
期望结果
A B C 1 19 9 15 2 17 5 8 3 13 12 16
解决方案
方法1:基础R实现
通过apply()计算每行最小值(忽略NA),再筛选出B列等于该行最小值的行:
# 计算每行最小值,忽略NA row_mins <- apply(df, 1, min, na.rm = TRUE) # 筛选目标行 result_df <- df[df$B == row_mins, ]
方法2:tidyverse框架实现
使用dplyr的管道语法,按行处理并筛选:
library(dplyr) result_df <- df %>% rowwise() %>% # 计算当前行所有列的最小值,忽略NA mutate(row_min = min(c_across(everything()), na.rm = TRUE)) %>% # 筛选B列等于该行最小值的行 filter(B == row_min) %>% # 移除临时计算的辅助列 select(-row_min)
关键注意事项
- 原数据存在大量
NA,计算最小值时必须添加na.rm = TRUE,否则含NA的行最小值会返回NA,导致筛选失效。 - 日期格式列会被R自动转换为数值型进行比较(日期本质是自1970年以来的天数/秒数),无需额外处理,
min()函数可正常计算。
内容的提问来源于stack exchange,提问作者ygtmnv
相关产品推荐
相关产品推荐

