奇怪的标题,所以我的情况如下:我正在处理纵向数据,并希望列出所有已接受所有可用调查的受访者。例如,请考虑以下数据:
respondent <- c(rep(1, 3), 2, rep(3, 3), rep(4, 2))
survey <- c(1:3, 1, 1:3, 2:3)
survey.respondent <- data.table(respondent, survey)
# respondent survey
# 1: 1 1
# 2: 1 2
# 3: 1 3
# 4: 2 1
# 5: 3 1
# 6: 3 2
# 7: 3 3
# 8: 4 2
# 9: 4 3
在这种情况下,我想选择受访者1和3,因为他们是调查1,2和3中的两个。对于有限数量的调查,循环就足够了,但我&# 39; d喜欢这样做适用于任意数量的调查。
理想情况下,我有一个像
这样的功能f(col1, col2) { ... }
f(respondent, survey) # Would return c(1, 3) in this case
# Or alternatively
f(dt, col1, col2) { ... } # Presumably data.table would work best
f(survey.respondent, "respondent", "survey") # c(1, 3)
答案 0 :(得分:3)
尝试
res <- survey.respondent[, .SD[all(unique(survey.respondent$survey) %in%
unique(survey))], by = respondent]
res
# respondent survey
#1: 1 1
#2: 1 2
#3: 1 3
#4: 3 1
#5: 3 2
#6: 3 3
unique(res$respondent)
#[1] 1 3
或者更快的方法是使用.I
res <- survey.respondent[survey.respondent[,
.I[all(unique(survey.respondent$survey) %in%
unique(survey))], by = respondent]$V1]
或者您可以使用table
indx <- !rowSums(!table(survey.respondent))
names(indx)[indx]
#[1] "1" "3"
答案 1 :(得分:3)
试试这个(我只是将survey.respondent
重命名为df
,因为这是一个很长的名字..):
df = survey.respondent
Reduce(intersect, lapply(unique(df$survey), function(u) df[survey==u,]$respondent))
#[1] 1 3