如何在R中使用setdiff()来获取一个向量中但不在其他向量中的元素我的示例如下:
dat1 <- c("osa", "bli", "usd", "mnl")
dat2 <- c("mnu", "erd", "usd", "mnl")
dat3 <- c("ssu", "erd", "usd", "mnl")
以下代码仅返回dat1与dat2和dat3相比的不同之处:
diffs <- Reduce(setdiff,
list(A = dat1,
B = dat2,
C = dat3
)
如何修改此代码,以便能够获取向量中唯一存在的所有元素与另一个相比?感谢
答案 0 :(得分:6)
使用setdiff
的其他解决方案:
myl <- list(A = dat1,
B = dat2,
C = dat3)
lapply(1:length(myl), function(n) setdiff(myl[[n]], unlist(myl[-n])))
[[1]]
[1] "osa" "bli"
[[2]]
[1] "mnu"
[[3]]
[1] "ssu"
答案 1 :(得分:3)
第二种可能性:
f <- function (...)
{
aux <- list(...)
ind <- rep(1:length(aux), sapply(aux, length))
x <- unlist(aux)
boo <- !(duplicated(x) | duplicated(x, fromLast = T))
split(x[boo], ind[boo])
}
f(dat1, dat2, dat3)
$`1`
[1] "osa" "bli"
$`2`
[1] "mnu"
$`3`
[1] "ssu"
答案 2 :(得分:2)
试试这个:
all.dat <- list(dat1, dat2, dat3)
from.dat <- rep(seq_along(all.dat), sapply(all.dat, length))
in.dat <- split(from.dat, unlist(all.dat))
in.one.dat <- in.dat[sapply(in.dat, length) == 1]
in.one.dat
# $bli
# [1] 1
# $mnu
# [1] 2
# $osa
# [1] 1
# $ssu
# [1] 3
告诉您在dat
个对象中只找到了哪些项目,以及哪一个。如果您只关心姓名,请填写:names(in.one.dat)
。