首页 > 解决方案 > 用分组变量中的值替换 NA

问题描述

假数据

fruit <- c("Orange", "Banana", "Orange", "Banana")
flavour <- c("Bitter", NA, NA, "Sweet")
geo <- c(NA, NA, NA, "France")
value <- c(1, NA, NA, 4)
dd <- data.frame(fruit, flavour, geo, value)
rm(fruit, flavour, geo, value)

在此处输入图像描述

我想按“水果”对数据集进行分组,并将所有变量中的缺失值替换为分组数据中存在的值。

期望的输出

fruit <- c("Orange", "Banana", "Orange", "Banana")
flavour <- c("Bitter", "Sweet", "Bitter", "Sweet")
geo <- c(NA, "France", NA, "France")
value <- c(1, 4, 1, 4)
dd2 <- data.frame(fruit, flavour, geo, value)
rm(fruit, flavour, geo, value)

在此处输入图像描述

代码尝试

tt <- dd %>%
  group_by(fruit) %>%
  summarise_all()

标签: rdplyrna

解决方案


我们需要mutate_allgroup_by(summarise/summarise_all用于从多行中获取单行) 之后。使用na.locffromzoo用每列的相邻非 NA 元素填充 NA 元素

library(zoo)
library(dplyr)
dd %>% 
  group_by(fruit) %>% 
  mutate_all(funs(na.locf(na.locf(., na.rm =  FALSE), 
                 fromLast = TRUE, na.rm = FALSE)))
# A tibble: 4 x 4
# Groups:   fruit [2]
#  fruit  flavour geo    value
#  <fct>  <fct>   <fct>  <dbl>
#1 Orange Bitter  <NA>       1
#2 Banana Sweet   France     4
#3 Orange Bitter  <NA>       1
#4 Banana Sweet   France     4

推荐阅读