过滤特定变量的 tibble 但保留不匹配的行并填充 NA/NULL
Filter tibble for a specific variable but keep non matching rows and fill with 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 的所有 ID(即 10, 11, 12
),我想要的小标题看起来像这样,我保留所有不匹配的行并用 [=15 填充 <chr>
=] 和 <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
您可以使用 replace
或 ifelse
-
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)))
我有这个标题,我想通过一个项目的所有 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 的所有 ID(即 10, 11, 12
),我想要的小标题看起来像这样,我保留所有不匹配的行并用 [=15 填充 <chr>
=] 和 <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
您可以使用 replace
或 ifelse
-
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)))