在多个向量上调用setdiff()

时间:2014-03-27 10:16:41

标签: r

如何在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
)

如何修改此代码,以便能够获取向量中唯一存在的所有元素与另一个相比?感谢

3 个答案:

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