我有两个数组 'check' 和 'path' ,我希望只选择那些在路径中不存在的元素。我已经通过以下方式完成了,有没有更有效的方式来做到这一点?
check<-rbind(c(1,0),c(0,1),c(9,9))
path<-rbind(c(1,1),c(1,2),c(0,1),c(10,10))
new.check<-check[-(which(duplicated(rbind(path,check)))-nrow(path)),]
setdiff() 没有解决我的问题
我有两个数组 'check' 和 'path' ,我希望只选择那些在路径中不存在的元素。我已经通过以下方式完成了,有没有更有效的方式来做到这一点?
check<-rbind(c(1,0),c(0,1),c(9,9))
path<-rbind(c(1,1),c(1,2),c(0,1),c(10,10))
new.check<-check[-(which(duplicated(rbind(path,check)))-nrow(path)),]
setdiff() 没有解决我的问题
不是更有效,但更正确:
new.check <- check[ setdiff(1:nrow(check),(which(duplicated(rbind(path,check)))-nrow(path))),]
-
如果没有重复,使用索引将导致不正确的结果 - 比如说check <- rbind(c(1,0),c(9,9))
编辑:
或互换path
并check
用rbind()
fromLast=TRUE
new.check <- check[ setdiff(1:nrow(check),which(duplicated(rbind(check,path),fromLast=T))),]
使用 setdiff 和 %in% 的另一种方法
# get the elements in check that are not present in path
elements <- setdiff(unique(as.vector(check)),unique(as.vector(path)))
# convert check to data frame to access columns by name
checkd <- data.frame(check)
# check if either column has the required elements - if yes, extract that row
checkd[checkd$X1 %in% elements | checkd$X2 %in% elements ,]