如果一对值位于列表的列表中,则筛选dataframe

如果一对值位于列表的列表中,则筛选dataframe,r,filter,subset,R,Filter,Subset,我需要过滤与学生课程相关的数据框 我希望做的是获取所有行,其中([curr_code,course]不是组合),其中组合是一个列表列表,包含所有可能要删除的组合 combinations <- list( hydraulics = list(cod = 81017, exp = list("ICH2304", "IMM2003")), cience = list(cod = 81016, exp = list("ICH2304")), data_science = list(c

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

我希望做的是获取所有行,其中([curr_code,course]不是组合),其中组合是一个列表列表,包含所有可能要删除的组合

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"))
)
我应该得到:

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))))

new_data首先,将
组合作为嵌套列表使用会使事情变得复杂。如果可能,最好将其作为一个整洁的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
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
rows_no_match <- apply(exp_data, 1, function(x) {
    length(intersect(which(x[['course']] == comb$exp),
                     which(x[['curr_code']] == comb$cod))) == 0
    })

exp_data[rows_no_match,]
  id curr_code  course
3  3     81017 IIC1005
5  5     81015 ICH2304
7  7     81015 IBM1005