如何根据其他列中的值填充数据框列中的NA值?

时间:2020-07-07 12:58:33

标签: r dataframe

我想根据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

谢谢您的帮助

4 个答案:

答案 0 :(得分:3)

这是基本的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

答案 1 :(得分:1)

这是使用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 

如果是平局,则按字典顺序优先。

答案 2 :(得分:0)

尝试一下:

首先在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)

答案 3 :(得分:0)

如果avetable,则可以将which.maxis.nacharacter一起使用,并与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))

数据:

onclick="myFunction();myFunction2()"