2

duplicated()その位置が以前にベクトル内で複製されているかどうかに応じて、TRUEまたはステートメントを指定します。FALSE重複した位置だけでなく、それが重複している以前のすべての位置も削除したい場合はどうなりますか。

a <- c("A", "B", "C")
b <- c("A", "B", "C", "D")

a複製されるすべての値が含まれ、の値と複製されない他のいくつかの値bが含まれます。a

抽出するだけ"D"ですか?

4

4 に答える 4

9

これがもう1つです:

b[!b %in% a]
[1] "D"
于 2012-07-03T06:26:14.970 に答える
4

あなたが本当に持っているのが、いくつかの要素が複製され、いくつかの要素が複製されていない単一のベクトルである場合は、次のいずれかを試すことができます。

## Constructing an example that fits your narrative description of the situation
a <- c("A", "B", "C")
b <- c("A", "B", "C", "D")
ab <- c(a,b)

# Approach #1
setdiff(ab, ab[duplicated(ab)])
# [1] "D"

# Approach #2 
ab[!(duplicated(ab) | rev(duplicated(rev(ab))))] 
# [1] "D"
于 2012-07-03T06:16:47.300 に答える
3

@ Josh O'Brien、@ cogitovita、および@jmsignerによって投稿されたソリューションがより大きなデータセットでどのように機能するかを示すタイミングを次に示します。

set.seed(123)

a = sample(paste("ID_", seq(1e6), sep=""))
b = sample(a, 9e5, replace=TRUE)
ab = sample(c(a, b))

system.time(res1 <- setdiff(ab, ab[duplicated(ab)]))
#   user  system elapsed 
#  1.543   0.030   1.563 

system.time(res2 <- ab[!(duplicated(ab) | rev(duplicated(rev(ab))))])
#   user  system elapsed 
#  0.537   0.042   0.575 

system.time(res3 <- names(table(ab))[table(ab) == 1])
#   user  system elapsed 
# 52.208   0.255  52.218 

system.time(b[!b %in% a])
#user  system elapsed 
#0.098   0.002   0.100 

setequal(res1, res2)
# [1] TRUE
setequal(res1, res3)
# [1] TRUE    
于 2012-07-03T08:19:35.763 に答える
0
> table(c(a, b))
# A B C D
# 2 2 2 1
> names(table(c(a, b)))[table(c(a, b)) == 1]
# [1] "D"
于 2012-07-03T06:18:13.403 に答える