我需要过滤与学生课程相关的数据框。
我期望做的是获取所有行([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))))
有什么想法吗?
答案 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
,并将course
和curr_code
的值与comb
中的值进行匹配。 which
将返回找到该值的行号。通过取其中的intersect
,您可以得到一个向量,其中行的行索引两者匹配course
和curr_code
。如果没有匹配项,您将获得一个空向量。
由于我们要查找没有匹配项的行,因此我们只需检查该向量length
的{{1}}是否得到一个逻辑向量即可告诉您== 0
的哪些行没有匹配exp_data
中的行。我们可以简单地使用此向量使用方括号表示法来comb
的子集,以获得所需的结果。
exp_data