R 如何给每行中不等于最大值的值赋值?
我有一个包含一些值的数据框。现在我想在每一行中只保留max值,并为rest列指定0,如下所示: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
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
)