【发布时间】:2021-03-09 17:18:00
【问题描述】:
我有每个 id 重复行的数据,因为它是在两个不同的时间点收集的。根据以下规则,我想删除重复项并保留每个 id 一行:
对于每个id,保留最近时间点的值,除非最近的时间点缺失(NA);在这种情况下,取旧的时间点值。否则,如果两个时间点都是NA,则与NA保持一行。
示例数据
在此数据中,我们有 20 个人的体重被测量了两次。
df <- structure(list(id = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L,
6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), time_point = c("tp1",
"tp2", "tp1", "tp2", "tp1", "tp2", "tp1", "tp2", "tp1", "tp2",
"tp1", "tp2", "tp1", "tp2", "tp1", "tp2", "tp1", "tp2", "tp1",
"tp2"), weight = c(56L, NA, 95L, 88L, 61L, NA, 55L, 87L, 87L,
95L, NA, 96L, 88L, 90L, 72L, NA, NA, 67L, 52L, NA)), row.names = c(NA,
20L), class = "data.frame")
> df
## id time_point weight
## 1 1 tp1 56
## 2 1 tp2 NA
## 3 2 tp1 95
## 4 2 tp2 88
## 5 3 tp1 61
## 6 3 tp2 NA
## 7 4 tp1 55
## 8 4 tp2 87
## 9 5 tp1 87
## 10 5 tp2 95
## 11 6 tp1 NA
## 12 6 tp2 96
## 13 7 tp1 88
## 14 7 tp2 90
## 15 8 tp1 72
## 16 8 tp2 NA
## 17 9 tp1 NA
## 18 9 tp2 67
## 19 10 tp1 52
## 20 10 tp2 NA
当我们有那个人的两个weight 度量时,我们使用“tp2”版本,除非“tp2”是NA,然后我们会使用“tp1”。如果两者恰好都是NA,那么我们应该只保留一行NA。
期望的输出
## id time_point weight
## 1 1 tp1 56
## 2 2 tp2 88
## 3 3 tp1 61
## 4 4 tp2 87
## 5 5 tp2 95
## 6 6 tp2 96
## 7 7 tp2 90
## 8 8 tp1 72
## 9 9 tp2 67
## 10 10 tp1 52
例如,当我考虑使用dplyr 解决它时,我想它必须包括group_by(id) 和distinct() 之类的东西。但我真的不知道如何让它发挥作用。
编辑
我意识到上面的df 是我真实数据的过度简化示例。在实际数据中,我可能有更多的列需要根据我指定的去重算法进行处理。
例如,请参阅下面的df_2:
df_2 <- structure(list(id = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L,
6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), time_point = c("tp1",
"tp2", "tp1", "tp2", "tp1", "tp2", "tp1", "tp2", "tp1", "tp2",
"tp1", "tp2", "tp1", "tp2", "tp1", "tp2", "tp1", "tp2", "tp1",
"tp2"), weight = c(NA, 55L, 86L, NA, NA, NA, NA, NA, 92L, NA,
71L, 90L, NA, NA, 72L, 93L, 60L, 81L, NA, NA), height = c(NA,
78L, NA, 92L, 98L, NA, 66L, NA, NA, 73L, NA, NA, NA, 91L, NA,
NA, NA, 58L, 63L, NA)), row.names = c(NA, 20L), class = "data.frame")
> df_2
## id time_point weight height
## 1 1 tp1 NA NA
## 2 1 tp2 55 78
## 3 2 tp1 86 NA
## 4 2 tp2 NA 92
## 5 3 tp1 NA 98
## 6 3 tp2 NA NA
## 7 4 tp1 NA 66
## 8 4 tp2 NA NA
## 9 5 tp1 92 NA
## 10 5 tp2 NA 73
## 11 6 tp1 71 NA
## 12 6 tp2 90 NA
## 13 7 tp1 NA NA
## 14 7 tp2 NA 91
## 15 8 tp1 72 NA
## 16 8 tp2 93 NA
## 17 9 tp1 60 NA
## 18 9 tp2 81 58
## 19 10 tp1 NA 63
## 20 10 tp2 NA NA
因此,预期的输出将是:
## id weight height
## 1 1 55 78
## 2 2 86 92
## 3 3 NA 98
## 4 4 NA 66
## 5 5 92 73
## 6 6 90 NA
## 7 7 NA 91
## 8 8 93 NA
## 9 9 81 58
## 10 10 NA 63
【问题讨论】:
标签: r dplyr duplicates