代码之家  ›  专栏  ›  技术社区  ›  kittygirl

如何只保留行的最大值,并将其他值转换为NA?

r
  •  0
  • kittygirl  · 技术社区  · 6 年前
    df <- data.frame(
      cola = c(3,NA,NA,NA,1,5),
      colb = c(7,NA,NA,NA,NA,6),
      colc = c(NA, NA, 10, NA, NA, 6)
    )
    

    使用以上数据。例如,我想保留每行的最大值,并将其他值转换为NA,这意味着转换原始数据。框架

    cola colb colc
       3    7   NA
      NA   NA   NA
      NA   NA   10
      NA   NA   NA
       1   NA   NA
       5    6   6
    

    预期结果如下:

    cola colb colc
    NA    7   NA
    NA   NA   NA
    NA   NA   10
    NA   NA   NA
    1   NA   NA
    NA    6   6
    

    怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    我们可以使用 apply 环行( MARGIN = 1 )及 replace 不等于 max 具有 NA ,将转置指定回原始对象

    df[] <- t(apply(df, 1, function(x) replace(x, x != max(x, na.rm = TRUE), NA)))
    

    或者 rowMaxs

    library(matrixStats)
    i1 <- !!rowSums(!is.na(df))
    df[i1,] <-  replace(df[i1,], df[i1,] != rowMaxs(as.matrix(df[i1,]), 
                    na.rm = TRUE)[col(df[i1,])], NA)
    

    或者使用 dplyr

    library(dplyr)
    library(purrr)
    df %>% 
      mutate(new = reduce(., pmax, na.rm = TRUE)) %>% 
      transmute_at(vars(starts_with('col')), ~ replace(., .!= new, NA))
    
        2
  •  0
  •   Ronak Shah    6 年前

    你可以用 purrr::pmap_df

    purrr::pmap_df(df, ~{
          vec <- c(...)
          ifelse(vec != max(vec, na.rm = TRUE), NA, vec)
    })
    
    # A tibble: 6 x 3
    #   cola  colb  colc
    #  <dbl> <dbl> <dbl>
    #1    NA     7    NA
    #2    NA    NA    NA
    #3    NA    NA    10
    #4    NA    NA    NA
    #5     1    NA    NA
    #6    NA     6     6