如何在不匹配列表时有条件地添加数据行

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