如何在不匹配列表时有条件地添加数据行
how to conditionally add row of data when it doesn't match a list
我有一个数据集,其中包含 ID 号列表以及与该 ID 关联的值。但是这个数据集缺少一行与“id4”相关的数据。我通过检查 ID 编号列表来确认这一点,该列表显示第 4 行不匹配(尽管原则上,它可能丢失了任何或许多 ID)
id <- c("id1", "id2", "id3", "id5","id6");
time <- c(1, 2.5, 1, 4.5, 2);
total <- c(5,5,5,5,5);
data <- data.frame(id, time, total);data;
#> id time total
#> 1 id1 1.0 5
#> 2 id2 2.5 5
#> 3 id3 1.0 5
#> 4 id5 4.5 5
#> 5 id6 2.0 5
id_list <- c("id1", "id2", "id3", "id4", "id5","id6");
which(id_list %in% data$id)
#> [1] 1 2 3 5 6
由 reprex package (v2.0.1)
于 2021-09-29 创建
我想在缺少的id所在的行中添加一行并用正确的id号填充它(因此它与“id_list”中的列表匹配)然后用0填充“time”和“total” . 最终数据集如下所示:
#> id time total
#> 1 id1 1.0 5
#> 2 id2 2.5 5
#> 3 id3 1.0 5
#> 4 id4 0 0
#> 5 id5 4.5 5
#> 6 id6 2.0 5
但我不确定在使用 %in% 确定缺少哪些行后该去哪里。
我们可以用complete
library(dplyr)
library(tidyr)
data %>%
complete(id = id_list, fill = list(time = 0, total = 0))
-输出
# A tibble: 6 × 3
id time total
<chr> <dbl> <dbl>
1 id1 1 5
2 id2 2.5 5
3 id3 1 5
4 id4 0 0
5 id5 4.5 5
6 id6 2 5
使用 merge
-
的基础 R 选项
result <- merge(data.frame(id = id_list), data, all.x = TRUE)
result[is.na(result)] <- 0
result
# id time total
#1 id1 1.0 5
#2 id2 2.5 5
#3 id3 1.0 5
#4 id4 0.0 0
#5 id5 4.5 5
#6 id6 2.0 5
我有一个数据集,其中包含 ID 号列表以及与该 ID 关联的值。但是这个数据集缺少一行与“id4”相关的数据。我通过检查 ID 编号列表来确认这一点,该列表显示第 4 行不匹配(尽管原则上,它可能丢失了任何或许多 ID)
id <- c("id1", "id2", "id3", "id5","id6");
time <- c(1, 2.5, 1, 4.5, 2);
total <- c(5,5,5,5,5);
data <- data.frame(id, time, total);data;
#> id time total
#> 1 id1 1.0 5
#> 2 id2 2.5 5
#> 3 id3 1.0 5
#> 4 id5 4.5 5
#> 5 id6 2.0 5
id_list <- c("id1", "id2", "id3", "id4", "id5","id6");
which(id_list %in% data$id)
#> [1] 1 2 3 5 6
由 reprex package (v2.0.1)
于 2021-09-29 创建我想在缺少的id所在的行中添加一行并用正确的id号填充它(因此它与“id_list”中的列表匹配)然后用0填充“time”和“total” . 最终数据集如下所示:
#> id time total
#> 1 id1 1.0 5
#> 2 id2 2.5 5
#> 3 id3 1.0 5
#> 4 id4 0 0
#> 5 id5 4.5 5
#> 6 id6 2.0 5
但我不确定在使用 %in% 确定缺少哪些行后该去哪里。
我们可以用complete
library(dplyr)
library(tidyr)
data %>%
complete(id = id_list, fill = list(time = 0, total = 0))
-输出
# A tibble: 6 × 3
id time total
<chr> <dbl> <dbl>
1 id1 1 5
2 id2 2.5 5
3 id3 1 5
4 id4 0 0
5 id5 4.5 5
6 id6 2 5
使用 merge
-
result <- merge(data.frame(id = id_list), data, all.x = TRUE)
result[is.na(result)] <- 0
result
# id time total
#1 id1 1.0 5
#2 id2 2.5 5
#3 id3 1.0 5
#4 id4 0.0 0
#5 id5 4.5 5
#6 id6 2.0 5