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

如何将数据框每行非最大值设为0?求R语言实现方案

嘿,这个需求很明确,我帮你整理了两种可行的方法,都能完美实现你想要的效果:

方法一:Base R 实现

你已经算出了每行的最大值rowmax,接下来只需要逐行处理,把非最大值的列替换为0就行:

# 你已有的初始化和计算行最大值代码
df <- data.frame(a= c(1,2,3,4,5),b= c(2,5,3,9,7),c= c(40,6,2,1,7))
df$rowmax <- apply(df,1,max)

# 处理a、b、c列,将非最大值设为0
df[, c("a", "b", "c")] <- t(apply(df[, c("a", "b", "c")], 1, function(x) {
  ifelse(x == max(x), x, 0)
}))

这里用apply逐行遍历数据,t()是为了把apply返回的列格式结果转置成行,和原数据框的结构匹配,确保替换后列对应正确。

方法二:dplyr(Tidyverse)实现

如果你习惯用tidyverse的语法,这种方式更直观简洁:

library(dplyr)

df <- tibble(a= c(1,2,3,4,5),b= c(2,5,3,9,7),c= c(40,6,2,1,7)) %>%
  mutate(rowmax = pmax(a, b, c)) %>% # 用pmax更高效计算行最大值
  rowwise() %>%
  mutate(across(c(a, b, c), ~ ifelse(.x == rowmax, .x, 0))) %>%
  ungroup()
  • pmax(a,b,c)比apply更适合计算多列的行最大值,运行效率更高;
  • rowwise()让我们可以对每行单独处理数据;
  • across()批量操作a、b、c列,判断每个值是否等于该行的rowmax,是则保留原值,否则设为0;
  • 最后用ungroup()取消行分组,避免后续操作受行分组规则影响。

两种方法运行后,都会得到你期望的输出:

# A tibble: 5 × 4
      a     b     c rowmax
  <dbl> <dbl> <dbl>  <dbl>
1     0     0    40     40
2     0     0     6      6
3     3     0     0      3
4     0     9     0      9
5     0     7     7      7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:25:02