You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否有R函数可转换DataFrame,仅保留每行最小值其余设为NA?

解决方案

首先还原你的数据:

df <- structure(list(V1 = c(NA, 650L, 743L), V2 = c(881L, 760L, 834L
), V3 = c(950L, 890L, 960L), V4 = c(981L, NA, 1001L), V5 = c(1000L, 
NA, 1115L)), row.names = c(NA, -3L), class = "data.frame")

方法一:基础R实现

通过apply对每行处理,找出每行最小值后,将非最小值元素替换为NA:

# 对每行执行逻辑判断
result_df <- t(apply(df, 1, function(x) {
  row_min <- min(x, na.rm = TRUE)
  ifelse(x == row_min, x, NA)
}))

# 转换为数据框并保留原行列名
result_df <- as.data.frame(result_df)
colnames(result_df) <- colnames(df)
rownames(result_df) <- rownames(df)

方法二:tidyverse 风格实现

使用dplyr和tidyr函数,通过长表转换完成操作:

library(dplyr)
library(tidyr)

result_df <- df %>%
  # 添加行ID用于分组
  mutate(row_id = row_number()) %>%
  # 转换为长格式
  pivot_longer(-row_id, names_to = "col", values_to = "val") %>%
  # 按行分组,替换非最小值为NA
  group_by(row_id) %>%
  mutate(val = ifelse(val == min(val, na.rm = TRUE), val, NA)) %>%
  # 转换回宽格式
  pivot_wider(names_from = "col", values_from = "val") %>%
  # 移除行ID列
  select(-row_id) %>%
  # 恢复原行名
  `rownames<-`(rownames(df))

两种方法执行后,都会得到你期望的结果:

V1   V2   V3   V4   V5
1   NA  881   NA   NA   NA
2  650   NA   NA   NA   NA
3  743   NA   NA   NA   NA

内容的提问来源于stack exchange,提问作者Kate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:57:50