R语言如何将数据框中Inf/-Inf替换为对应行的最大/最小值
方法1:基础R实现
直接用apply逐行遍历处理即可,计算每行排除无穷值后的最值再替换:
# 示例数据 x <- data.frame(val1 = c(1,4,5,2), val2 = c(4,2,46,2), val3 = c(Inf, 1, 4, 9), val4 = c(13, 51, 3, -Inf)) # 逐行替换 x_fixed <- t(apply(x, 1, function(row) { # 计算当前行排除无穷值的最大、最小值 row_max <- max(row[is.finite(row)]) row_min <- min(row[is.finite(row)]) # 替换无穷值 row[row == Inf] <- row_max row[row == -Inf] <- row_min return(row) })) |> as.data.frame()
运行后得到的x_fixed就是你要的结果。
方法2:tidyverse风格实现
如果你习惯用dplyr,可以用rowwise()配合across()实现:
library(dplyr) x_fixed <- x |> rowwise() |> # 先计算当前行的有效最值 mutate( row_max = max(c_across(everything())[is.finite(c_across(everything()))]), row_min = min(c_across(everything())[is.finite(c_across(everything()))]) ) |> # 替换所有列的无穷值 mutate(across(everything(), ~case_when( .x == Inf ~ row_max, .x == -Inf ~ row_min, .default = .x ))) |> # 删除临时计算的最值列 ungroup() |> select(-row_max, -row_min)
两种方法都能得到你给出的预期输出结果。
内容的提问来源于stack exchange,提问作者Justin Dhindsa
相关产品推荐
相关产品推荐

