首页 > 解决方案 > 根据定义为数字名称的列子集过滤 NA

问题描述

我正在尝试在数值列的子集中过滤所有包含系统 NA 的记录。

这是一个玩具示例。

library(tidyverse)

df <- tibble(
    year = c(2001, 2002, 2003, 2001, 2002, 2003, 2001),
    rank = c(12, 25, 65, NA, NA, NA, NA),
    category = c("a", "a", "b", "c", "c", "c", NA),
    other = c("x", "y", "x", "y", "x", "y", "x")
)

df %>%
    pivot_wider(names_from = year, values_from =  rank) %>%
    filter(.cols = c(2001:2003),
           .fns = ~ !is.na(.x))

此代码不起作用,它无法识别列2001:2003-通过过滤列 2001、2002、2003 的所有 NA 来基本上删除第三条记录的正确方法是什么。列范围需要像我一样指定为范围2001:2003。

应该过滤掉记录“c”,但不是所有列都是 NA 的记录(玩具示例中的最后一个)

这是我得到的错误:

错误:filter()输入有问题..1。x 输入..1已命名。ℹ 这通常意味着您使用=的是==. ℹ 你的意思是.cols == c(2001:2003)

标签: rpivottidyverse

解决方案


您可以按列过滤。利用across

df %>% 
  pivot_wider(names_from = year, values_from =  rank) %>%
  filter(rowSums(!across(`2001`:`2003`, is.na)) > 0L)

输出

# A tibble: 3 x 5
  category other `2001` `2002` `2003`
  <chr>    <chr>  <dbl>  <dbl>  <dbl>
1 a        x         12     NA     NA
2 a        y         NA     25     NA
3 b        x         NA     NA     65

推荐阅读