我有一个大型数据框 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 中:
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>