替换 Dataframe 中每列中最小值之后的值

bweufnob  于 2023-03-27  发布在  其他
关注(0)|答案(3)|浏览(133)

我试图用最小值替换 Dataframe 中最小值之后的每个值。
例如:我有一个类似下面的dataframe

a<-c(1:6)
b<-c(6, 1:5)
c<-c(5:6, 1:4)
d<-c(4:6, 1:3)
e<-c(3:6, 1:2)
f<-c(2:6, 1)

df<- data.frame(a, b, c, d, e, f)

df 

a  b  c  d  e  f
1  2  3  4  5  6
6  1  2  3  4  5
5  6  1  2  3  4
4  5  6  1  2  3  
3  4  5  6  1  2  
2  3  4  5  6  1

在这种情况下,我想把出现在1后面的每个值都转换为1。

df

a  b  c  d  e  f
1  2  3  4  5  6
1  1  2  3  4  5
1  1  1  2  3  4
1  1  1  1  2  3  
1  1  1  1  1  2  
1  1  1  1  1  1

我本来想通过使用which.min()找到最小值的位置,然后使用索引,将后面的所有内容替换为min值,但我只知道如何一次对一列执行此操作。我如何同时对 Dataframe 中的每一列执行此操作?
我还需要能够将最小值之前的每个值替换为1,但我认为一旦知道如何进行逆运算,我就可以计算出来。

nr9pn0ug

nr9pn0ug1#

使用lapply可以做到:

df[] <- lapply(df, \(x) { x[seq_along(x) > which.min(x)] <- min(x); x })

df
#>   a b c d e f
#> 1 1 6 5 4 3 2
#> 2 1 1 6 5 4 3
#> 3 1 1 1 6 5 4
#> 4 1 1 1 1 6 5
#> 5 1 1 1 1 1 6
#> 6 1 1 1 1 1 1
lokaqttq

lokaqttq2#

我们可以使用tidyverse

library(dplyr)
df %>%
    mutate(across(everything(), ~ case_when(row_number() > which.min(.x) ~ 
           min(.x), TRUE ~ .x)))
  • 输出
a b c d e f
1 1 6 5 4 3 2
2 1 1 6 5 4 3
3 1 1 1 6 5 4
4 1 1 1 1 6 5
5 1 1 1 1 1 6
6 1 1 1 1 1 1
fykwrbwg

fykwrbwg3#

我们可以使用max.col生成掩码矩阵msk

> p <- max.col(-df, "first")

> msk <- row(df) >= max.col(-df, "first")[col(df)]

> replace(df, msk, t(df[cbind(p, 1:ncol(df))] * t(msk))[msk])
  a b c d e f
1 1 6 5 4 3 2
2 1 1 6 5 4 3
3 1 1 1 6 5 4
4 1 1 1 1 6 5
5 1 1 1 1 1 6
6 1 1 1 1 1 1

相关问题