【问题标题】:How can I fill NA-values in a data frame column based on the values from an other column? [duplicate]如何根据其他列的值填充数据框列中的 NA 值? [复制]
【发布时间】:2020-10-27 17:55:09
【问题描述】:

我想根据 F1 列分组时最常见的 F2 值填充 F2 列中的 NA 值。

  F1 F2
1 A  C
2 B  D
3 A  NA
4 A  C
5 B  NA

期望的结果:

  F1 F2
1 A  C
2 B  D
3 A  C
4 A  C
5 B  D

感谢您的帮助

【问题讨论】:

  • @Leero11 有平局时应该插入什么值?
  • @markus 在平局的情况下任何一个都可以

标签: r dataframe


【解决方案1】:

这是一个基本的 R 解决方案。首先为 Mode 定义一个函数(取自here),然后将其应用于您的数据框,即

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

df$F2 <- with(df, ave(F2, F1, FUN = function(i) replace(i, is.na(i), Mode(i))))

df
#  F1 F2
#1  A  C
#2  B  D
#3  A  C
#4  A  C
#5  B  D

【讨论】:

    【解决方案2】:

    这是使用dplyr 的一种方式:

    library(dplyr)
    
    df %>%
      group_by(F1) %>%
      mutate(F2 = replace(F2, is.na(F2), 
                          names(sort(table(F2), decreasing = TRUE)[1])))
    
    #  F1    F2   
    #  <chr> <chr>
    #1 A     C    
    #2 B     D    
    #3 A     C    
    #4 A     C    
    #5 B     D 
    

    在平局的情况下,优先考虑字典顺序。

    【讨论】:

      【解决方案3】:

      试试这个:

      首先在df2 中,我通过变量F1 获得最大计数,其中F2 没有丢失。当按 F1 分组时,这将为您提供最常见的 F2 值。我将它重新加入到原始 data.frame 中,并使用 mutate 填充新变量 F2_fill,然后将其从 data.frame 中的该变量中删除。

      library(tidyverse)
      
      df <- tribble(
        ~F1, ~F2,
       'A',  'C',
       'B' , 'D',
       'A'  ,NA,
       'A',  'C',
       'B',  NA)
      
      df2 <- df %>% 
              group_by(F1) %>% 
              count(F2) %>% 
              filter(!is.na(F2), n == max(n)) %>% 
              select(-n) %>% 
              rename(F2_fill = F2)
      
      df3 <- left_join(df,df2, by="F1") %>% 
            mutate(F2 = ifelse(is.na(F2), F2_fill,F2)) %>% 
              select(-F2_fill)
      

      【讨论】:

        【解决方案4】:

        您可以将avetablewhich.max 一起使用,并在character 时使用is.na 进行子集化。

        i <- is.na(x$F2)
        x$F2[i] <- ave(x$F2, x$F1, FUN=function(y) names(which.max(table(y))))[i]
        x
        #  F1 F2
        #1  A  C
        #2  B  D
        #3  A  C
        #4  A  C
        #5  B  D
        

        数据:

        x <- data.frame(F1 = c("A", "B", "A", "A", "B")
          , F2 = c("C", "D", NA, "C", NA))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-09
          • 2020-03-16
          • 2021-06-19
          • 2020-02-04
          • 1970-01-01
          • 1970-01-01
          • 2021-12-20
          • 1970-01-01
          相关资源
          最近更新 更多