R 删除只有 NA 的组

标签 r dataframe dplyr zoo

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

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 的区域和变量的组合,但保留那些仅包含几个 NA 的组合。背景是我想应用线性插值来计算后者的缺失值,方法是将 dplyrzoo-package 中的功能(用于插值)使用类似的东西这个:

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

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

最佳答案

要仅保留 regionvariablevalue 中至少有 1 个非 NA 条目的组合,您可以使用:

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

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

关于R 删除只有 NA 的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654141/

相关文章:

python - 向多索引数据帧上的每个索引添加一行

r - 将所有列中的值转换为 tibble/dplyr 中的某个值

r - 使用 knititations 在 RMarkdown 文档中包含引用书目

r - 在 R 中创建矢量元素均值矢量的最快方法

R复制函数返回一个数字矩阵而不是 'zoo'类型的列表

python - 在 Pandas 数据框中连接两个系列的更快方法

r - pmin() 与 dplyr 在 R

r - 将用户规范作为参数传递给 Shiny 中的 dplyr

r - 如何使用 fread 函数读取 CSV 文件的特定行

r - 在正向后查找后捕获,除非字符串包含 R 中的排除项