R 对多个向量调用setdiff()

R 对多个向量调用setdiff(),r,R,如何在R中使用setdiff()来获取一个向量中的元素,而不是其他向量中的元素我的示例如下: dat1 <- c("osa", "bli", "usd", "mnl") dat2 <- c("mnu", "erd", "usd", "mnl") dat3 <- c("ssu", "erd", "usd", "mnl") dat1试试这个: all.dat <- list(dat1, dat2, dat3) from.dat <- rep(seq_alon

如何在R中使用setdiff()来获取一个向量中的元素,而不是其他向量中的元素我的示例如下:

dat1 <- c("osa", "bli", "usd", "mnl")
dat2 <- c("mnu", "erd", "usd", "mnl")
dat3 <- c("ssu", "erd", "usd", "mnl")
dat1试试这个:

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
all.dat第二种可能性:

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"

f另一种使用
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"

myl感谢所有优雅的解决方案。他们都做得很好。非常感谢!有没有办法将列表输出转换为数据帧?
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"