R仅删除具有NA的组

时间:2016-02-26 14:21:07

标签: r dataframe dplyr zoo

我有一个类似于以下结构生成的数据框:

GetTableData

library(dplyr) df1 <- expand.grid(region = c("USA", "EUR", "World"), time = c(2000, 2005, 2010, 2015, 2020), scenario = c("policy1", "policy2"), variable = c("foo", "bar")) df2 <- expand.grid(region = c("USA", "EUR", "World"), time = seq(2000, 2020, 1), scenario = c("policy1", "policy2"), variable = c("foo", "bar")) df2 <- filter(df2, !(time %in% c(2000, 2005, 2010, 2015, 2020))) df1$value <- rnorm(dim(df1)[1], 1.5, 1) df1[df1 < 0] <- NA df2$value <- NA df1[df1$region == "World" & df1$variable == "foo", "value"] <- NA df <- rbind(df1, df2) rm(df1, df2) df <- arrange(df, region, scenario, variable, time) 包含两种&#34;类型&#34; NA。对于区域和变量的一个组合(World / foo),根本没有数据。对于所有其他组合,我们在2000年,2005年,2010年,2015年,2020年之间的所有年份都有NA。

我需要一个过滤器来删除仅包含NA的区域和变量的组合,但保留那些仅包含少量NA的组合。背景是我想通过组合dfdplyr包中的功能(用于插值)来应用线性插值来计算后者的缺失值:

zoo

仅包含NAs的组会导致df <- group_by(df, region, scenario, variable, time) %>% mutate(value = zoo::na.approx(value)) %>% ungroup() 返回错误,因为它不能仅对NAs起作用。

1 个答案:

答案 0 :(得分:5)

要仅保留region中至少包含1个非NA条目的variablevalue的组合,您可以使用:

df %>% group_by(region, variable) %>% filter(any(!is.na(value)))

或等效地:

df %>% group_by(region, variable) %>% filter(!all(is.na(value)))

使用data.table,您可以使用:

library(data.table)
setDT(df)[, if(any(!is.na(value))) .SD, by = .(region, variable)]

基地R的方法可能是:

df_split <- split(df, interaction(df$region, df$scenario, df$variable))
do.call(rbind.data.frame, df_split[sapply(df_split, function(x) any(!is.na(x$value)))])