R 如何给每行中不等于最大值的值赋值?

R 如何给每行中不等于最大值的值赋值?,r,dataframe,max,R,Dataframe,Max,我有一个包含一些值的数据框。现在我想在每一行中只保留max值,并为rest列指定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 rowmax <dbl> <dbl> <dbl> <dbl> 1 2 40

我有一个包含一些值的数据框。现在我想在每一行中只保留max值,并为rest列指定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 rowmax
  <dbl> <dbl> <dbl>  <dbl>
     1     2    40     40
     2     5     6      6
     3     3     2      3
     4     9     1      9
     5     7     7      7
#ideal out put
     a     b     c    rowmax
     0     0     40    40
     0     0     6     6
     3     3     0     3
     0     9     0     9
     0     7     7     7

df使用
pmax
获取行的
max
,然后选择
mutate_at
中interset的列,并
replace
替换每列中不等于0的值可能更有效

library(dplyr)
library(purrr)
df %>% 
   mutate(rowmax = reduce(., pmax)) %>% 
   #or as  @tmfmnk mentioned in the comments
   # mutate(rowmax = exec(pmax, !!!.)) %>%
   mutate_at(vars(a:c), ~ replace(., .!= rowmax, 0))
   #Or do a multiplication
   #mutate_at(vars(a:c), ~. * (.== rowmax))

此外,如果我们不需要
rowmax
列,则可以使用
base R
选项

df * (df == do.call(pmax, df))

一个
base
选项:

sweep(df, 1, apply(df, 1, max), FUN = function(x, y) x * (x == y))
输出:

  a b  c
1 0 0 40
2 0 0  6
3 3 3  0
4 0 9  0
5 0 7  7

这不值得单独发表一篇文章,但第一步也可能是变异(rowmax=exec(pmax,!!!))
@akrun我遵循您的命令和答案,您主要在函数中使用点,如此答案中的
reduce(,pmax)
replace(,!=rowmax,0)
。那些点代表什么?语法还是速记?@maydin。在第一种情况下,
reduce
,它指的是来自
%>%
的lhs的整个数据集,在
mutate_at/summary_at/summary_if/mutate_if/transmute_if/at/filter_at/filter_if
中,它指的是单个列。这更像是
lappy(df1,函数(x)x)
@akrun我有个问题。如果这个数据集中有另一列字符,有没有办法以整洁的方式处理这个任务?@akrun我明白了。非常感谢你的建议。我想今年夏天我离开教书的时候我会在附近。回头见,看起来很酷!谢谢你能告诉我一些关于x*(x==y)的情况吗?我没有得到它。我们只是将行中的每个元素乘以0(如果它不等于行的最大值-
x==y
的结果是
FALSE
)或1(如果它相等-
TRUE