我有一个包含 1000 行的大型面板数据。我想使用 group by (gvkey) 并为 NA 估算值,但有些组具有所有 NA。我想忽略那些群体。
这些代码行给了我我想要的东西
set.seed(123)
fake_data <- data.frame(
gvkey = rep(c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), each = num_years),
year = rep(2010:2014, 10),
dltt = rnorm(50))
for (gvkey in c("A", "B", "D", "E", "F", "G", "H", "I", "J")) {
year_to_replace <- sample(c(2011, 2012, 2013), size = sample(2:3, 1), replace = FALSE)
fake_data$dltt[fake_data$gvkey == gvkey & fake_data$year %in% year_to_replace] <- NA
}
fake_data <- fake_data %>%
arrange(gvkey, year) %>%
group_by(gvkey) %>%
mutate(dltt_imputed = na.approx(dltt))
但是如果某些组有所有 NAs,我会得到一个错误
fake_data$dltt[fake_data$gvkey == "C"] <- NA
fake_data <- fake_data %>%
arrange(gvkey, year) %>%
group_by(gvkey) %>%
mutate(dltt_imputed = na.approx(dltt))
请有人帮我在正在进行的管道中添加一些条件以忽略这些组
一个选项是为
mutate()
提供一个条件来忽略具有完整缺失值的组(here, group C)
,并使用相关组的相应非缺失值来近似缺失值。由于您的问题中未提供num-years
,因此我根据值的总数num_years=5
将其假设为(50)
。
library(zoo)
library(tidyverse)
num_years <- 5
fake_data$dltt[fake_data$gvkey == "C"] <- NA
fake_data <- fake_data %>%
arrange(gvkey, year) %>%
group_by(gvkey) %>%
mutate(dltt_imputed = ifelse(sum(is.na(dltt)) == num_years | !(is.na(dltt)), dltt, na.approx(dltt)))
请注意,新的估算列将包含
group C
并且不排除具有完整缺失值的此类组。所以我会把这个留给 QO 如何在新的估算列中处理完整的缺失组。