如何将数据框每行非最大值设为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
相关产品推荐
相关产品推荐

