如果一对值在列表中,则过滤数据框

时间:2018-09-05 18:26:12

标签: r filter subset

我需要过滤与学生课程相关的数据框。

我期望做的是获取所有行([curr_code,当然]不在组合中),其中组合是包含所有可能删除的组合的列表的列表。

combinations <- list(
  hydraulics = list(cod = 81017, exp = list("ICH2304", "IMM2003")),
  cience = list(cod = 81016, exp = list("ICH2304")),
  data_science = list(cod = 81015, exp = list("IIC1005"))
)

这是我的一部分数据(exp_data):

id  curr_code  course
1   81017      ICH2304
2   81017      IMM2003
3   81017      IIC1005
4   81016      ICH2304
5   81015      ICH2304
6   81015      IIC1005
7   81015      IBM1005

我应该得到:

id  curr_code  course
1   81017      IIC1005
2   81015      ICH2304
3   81015      IBM1005

我尝试使用:

new_data <- filter(exp_data, !(list.any(combinations, (course %in% exp) && (cod == curr_code))))

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,使用combinations作为嵌套列表会使事情变得复杂。如果可能的话,最好将其作为整洁的data.frame:

comb <- data.frame(name = c('hydraulics','hydraulics','cience','data_science'),
                   cod = c(81017, 81017, 81016, 81015),
                   exp = c("ICH2304", "IMM2003", "ICH2304", "IIC1005"))
comb
          name   cod     exp
1   hydraulics 81017 ICH2304
2   hydraulics 81017 IMM2003
3       cience 81016 ICH2304
4 data_science 81015 IIC1005

现在,我们可以逐行遍历您的exp_data,并将coursecurr_code的值与comb中的值进行匹配。 which将返回找到该值的行号。通过取其中的intersect,您可以得到一个向量,其中行的行索引两者匹配coursecurr_code。如果没有匹配项,您将获得一个空向量。

由于我们要查找没有匹配项的行,因此我们只需检查该向量length的{​​{1}}是否得到一个逻辑向量即可告诉您== 0的哪些行没有匹配exp_data中的行。我们可以简单地使用此向量使用方括号表示法来comb的子集,以获得所需的结果。

exp_data