繁体   English   中英

R删除仅具有NA的组

[英]R remove groups with only NAs

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

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)

df包含两种NA类型。 对于区域和变量(World / foo)的一种组合,根本没有数据。 对于所有其他组合,我们具有除2000、2005、2010、2015、2020年以外的所有年份的资产净值。

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

df <- group_by(df, region, scenario, variable, time) %>%
      mutate(value = zoo::na.approx(value)) %>% ungroup()

仅包含NA的组会导致na.approx返回错误,因为它不能仅对NA起作用。

若要仅保留至少具有1个非NA条目valueregionvariable组合,可以使用:

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)))])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM