代码之家  ›  专栏  ›  技术社区  ›  Valeria Lobos Ossandón

用r中的最大行替换NaN值

  •  0
  • Valeria Lobos Ossandón  · 技术社区  · 7 年前

    我有以下数据帧(df):

    PARTY_ID O1 O2 O3 O4
    P1 20 NA NA NA
    P2 3 18 NA NA
    

    我需要用每行的最大值替换na值。我想要的输出是:

    PARTY_ID O1 O2 O3 O4
    P1 20 20 20 20
    P2 3 18 18 18
    

    我需要快速完成这项工作,因为我的数据有60万行。 有人能帮我吗?

    4 回复  |  直到 7 年前
        1
  •  1
  •   Mislav    7 年前

    我没有可复制的数据集,但这可能有效:

    t(apply(df_mat, 1, function(x) {ifelse(is.na(x), max(x, na.rm = TRUE), x)}))
    
        2
  •  2
  •   MKR    7 年前

    可以使用多个选项 tidyverse 和; reshape2 包装。

    选项1: 您可以将数据转换为长格式并进行处理。最后,使用 dcast

    library(tidyverse)
    library(reshape2)
    
    df %>% gather(Key, Value, -PARTY_ID) %>%
      group_by(PARTY_ID) %>%
      mutate(Value = ifelse(is.na(Value), max(Value, na.rm = TRUE), Value)) %>%
      dcast(PARTY_ID~Key, value.var = "Value")
    
    #   PARTY_ID O1 O2 O3 O4
    # 1       P1 20 20 20 20
    # 2       P2  3 18 18 18
    

    选项2: OP提到她有很多排( 600K )在data.frame中。因此,另一种选择是使用宽格式的数据本身。 dplyr::mutate_at 在这种情况下会有很大的帮助。我宁愿选择这个选项。

    library(dplyr)
    
    df %>% mutate(RowMax = apply(select(.,starts_with("O")), 1, FUN=max, na.rm=TRUE)) %>%
      mutate_at(vars(starts_with("O")), funs(ifelse(is.na(.), RowMax,.))) %>%
      select(-RowMax)
    
    #   PARTY_ID O1 O2 O3 O4
    # 1       P1 20 20 20 20
    # 2       P2  3 18 18 18
    

    数据:

    df <- read.table(text = 
    "PARTY_ID O1 O2 O3 O4
    P1 20 NA NA NA
    P2 3 18 NA NA",
    header = TRUE, stringsAsFactors = FALSE)
    
        3
  •  1
  •   BENY    7 年前

    解决方案来自 zoo na.locf

    data.frame(t(na.locf(t(A))))
    
      PARTY_ID O1 O2 O3 O4
    1       P1 20 20 20 20
    2       P2  3 18 18 18
    
        4
  •  1
  •   thelatemail    7 年前

    这应该是非常快的,因为它是一个单独的任务,而不是一行一行:

    idxna <- which(is.na(df[-1]), arr.ind=TRUE)
    df[-1][idxna] <- do.call(pmax, c(df[-1], na.rm=TRUE))[idxna[,"row"]]
    df
    
    #  PARTY_ID O1 O2 O3 O4
    #1       P1 20 20 20 20
    #2       P2  3 18 18 18
    

    使用@mkr的数据。