是否有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
相关产品推荐
相关产品推荐

