【发布时间】:2018-03-11 21:17:35
【问题描述】:
我有一些调查数据。每行代表对“受访者”的采访。一些受访者接受了一次采访;其他人多次接受采访。我想从这个 tibble 中只选择每个受访者的最后一次采访。
这是一个最小的例子:
tmp <- tribble(
~YYYYMM, ~ID, ~DATEPR, ~IDPREV,
198001, 1, NA, NA,
198001, 2, NA, NA,
198001, 3, NA, NA,
198002, 1, 198001, 1,
198002, 2, NA, NA,
198002, 3, NA, NA,
198003, 1, 198002, 1,
198003, 2, NA, NA,
198003, 3, 198002, 3)
在哪里
YYYYMM是采访日期。DATEPR是受访者上次采访的日期(如果有的话)。ID仅在采访波中是唯一的。这意味着,例如,ID==2和YYYMM==198001的受访者不必是ID==2和YYYMM==198002的受访者。IDPREV是受访者之前采访的 ID,如果有的话。
上面的小标题有九行。但一位受访者接受了 3 次采访,另一位受访者接受了两次采访。我只想要每个受访者的最后一次采访,所以我想要一个只有六行的小标题。这段代码完成了这项工作:
for (i in 1:nrow(tmp)) {
if (!is.na(tmp$DATEPR[i])) {
ind <- which(tmp$YYYYMM == tmp$DATEPR[i] & tmp$ID == tmp$IDPREV[i])
tmp <- tmp[-ind, ]
}
}
但它似乎有点难以解析。是否有更清晰的方法可以使用 tidyverse 功能达到相同的目的?我想到了一个两步功能:首先,获取要删除的所有行的索引;其次,删除行。但我无法使用map 或dplyr 函数实现此解决方案。
【问题讨论】: