首页 > 解决方案 > 过滤特定变量的小标题,但保留不匹配的行并用 NA/NULL 填充

问题描述

我有这个小标题,我想按项目的所有 id 过滤它,但另外保留所有行并用 NA 或 0 填充这些行。

library(tibble)
tibble::tibble(item=c("a", "a", "a", "b", "b", "b", "c", "c", "c"), 
               id=c("10","11","12","10","15","16","8","9","12"),
               val=c(25,27,31,24,38,39,12,14,39))

# A tibble: 9 x 3
  item  id      val
  <chr> <chr> <dbl>
1 a     10       25
2 a     11       27
3 a     12       31
4 b     10       24
5 b     15       38
6 b     16       39
7 c     8        12
8 c     9        14
9 c     12       39

例如,我想过滤项目 a (即10, 11, 12)的所有 id,我想要的 tibble 看起来像这样,我保留所有不匹配的行并<chr>NA<dbl>填充0

# A tibble: 9 x 3
  item  id      val
  <chr> <chr> <dbl>
1 a     10       25
2 a     11       27
3 a     12       31
4 b     10       24
5 b     NA        0
6 b     NA        0
7 c     NA        0
8 c     NA        0
9 c     12       39

标签: rtidyversetidyr

解决方案


您可以使用replaceifelse-

library(dplyr)

keep <- c(10, 11, 12)

df %>%
  mutate(val = replace(val, !id %in% keep, 0), 
         id = replace(id, !id %in% keep, NA))

#  item  id      val
#  <chr> <chr> <dbl>
#1 a     10       25
#2 a     11       27
#3 a     12       31
#4 b     10       24
#5 b     NA        0
#6 b     NA        0
#7 c     NA        0
#8 c     NA        0
#9 c     12       39

如果你有很多列,你可以使用across-

df %>%
  mutate(across(c(where(is.character), -item), ~replace(., !id %in% keep, NA)), 
         across(where(is.numeric), ~replace(., !id %in% keep, 0)))

推荐阅读