列出数据集中存在的列的值,其中包含另一列的所有值

时间:2015-02-20 09:14:56

标签: r

奇怪的标题,所以我的情况如下:我正在处理纵向数据,并希望列出所有已接受所有可用调查的受访者。例如,请考虑以下数据:

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)

2 个答案:

答案 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