我需要过滤一个与学生课程相关的数据。
我想要做的是,得到所有的行(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))))有什么想法吗?
发布于 2018-09-05 18:49:21
首先,将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匹配。如果没有匹配,就会得到一个空向量。
因为我们正在寻找没有匹配的行,所以我们只需检查向量== 0的== 0是否可以得到一个逻辑向量,告诉您哪些exp_data行在comb中没有匹配的行。我们可以简单地使用这个向量来子集exp_data,使用方括号表示法来得到我们想要的结果。
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 IBM1005https://stackoverflow.com/questions/52191370
复制相似问题