r - 过滤特定变量的小标题,但保留不匹配的行并用 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
解决方案
您可以使用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)))
推荐阅读
- gfortran - 使用 -fcheck=all 时不会警告未初始化的变量
- mysql - 如何使用mysql准备和执行语句调用带有输入和输出参数的存储过程?
- vb.net - vb.net 中的 Datagridview 到 Crystal Report
- python - 将numpy digitize函数翻译成c#
- laravel - htmlspecialchars() 期望参数 1 是字符串,给定数组(查看:/opt/lampp/htdocs/SED/resources/views/reports/log_print.blade.php)
- vba - Word VBA:While循环要做,直到一无所获
- php - 在for循环php中获取值1 - 2 - 1 - 2 - 1
- flutter - 在 Flutter 中开发私有包
- python - Pyenv 无法在 mac 中安装 python 3.5.2
- android - 在 textview 更新上旋转动画