根据数据帧的所有因子列的条件,用 NA 替换行的特定级别

问题描述 投票:0回答:1

我有一个大型数据框 df_f,跨多个列具有不同级别(本例中为 5 列):

c1 <- as.factor(c("NA", "1.1_mif", "NA", "NA", "1.1_mif", "1.1_mif", "NA", "1.3_sef"))
c2 <- as.factor(c("NA", "NA", "1.1_mif", "NA", "NA", "1.2_mof", "NA", "NA"))
c3 <- as.factor(c("NA", "NA", "1.2_mof", "1.2_mof", "NA", "1.3_sef", "NA", "NA"))
c4 <- as.factor(c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA"))
c5 <- as.factor(c("NA", "1.3_sef", "NA", "1.3_sef", "NA", "NA", "NA", "NA"))
df_f <- data.frame(c1, c2, c3, c4, c5)
       c1      c2      c3     c4      c5
1      NA      NA      NA     NA      NA
2 1.1_mif      NA      NA     NA 1.3_sef
3      NA 1.1_mif 1.2_mof     NA      NA
4      NA      NA 1.2_mof     NA 1.3_sef
5 1.1_mif      NA      NA     NA      NA
6 1.1_mif 1.2_mof 1.3_sef     NA      NA
7      NA      NA      NA     NA      NA
8 1.3_sef      NA      NA     NA      NA

我对三个级别特别感兴趣:“1.1_mif”、“1.2_mof”和“1.3_sef”。

我想创建一个函数,如果其中几个级别出现在同一行(跨所有列)上,则该函数允许我保留上述三个级别中索引最高的级别 - 并替换另一个级别(s) 与 NA。

预期结果:

       c1    c2      c3      c4      c5
1      NA    NA      NA      NA      NA
2      NA    NA      NA      NA 1.3_sef
3      NA    NA 1.2_mof      NA      NA
4      NA    NA      NA      NA 1.3_sef
5 1.1_mif    NA      NA      NA      NA
6      NA    NA 1.3_sef      NA      NA
7      NA    NA      NA      NA      NA
8 1.3_sef    NA      NA      NA      NA

我正在努力寻找在 R 中执行此操作的非常有效的方法(跨所有列:)

r function replace multiple-conditions levels
1个回答
0
投票

在基础 R 中:

fn <- function(x){
  a <- do.call(pmax, c(type.convert(df_f, as.is=TRUE), na.rm = TRUE))
  `is.na<-`(df_f, df_f != a)
}

fn(df_f)

       c1   c2      c3   c4      c5
1      NA   NA      NA   NA      NA
2    <NA> <NA>    <NA> <NA> 1.3_sef
3    <NA> <NA> 1.2_mof <NA>    <NA>
4    <NA> <NA>    <NA> <NA> 1.3_sef
5 1.1_mif <NA>    <NA> <NA>    <NA>
6    <NA> <NA> 1.3_sef <NA>    <NA>
7      NA   NA      NA   NA      NA
8 1.3_sef <NA>    <NA> <NA>    <NA>
© www.soinside.com 2019 - 2024. All rights reserved.