4

私は次の状況にあります:

vec1  <- c("A", "B", "D", "C", "E", "A", "C")
vec2 <- c("A", "B", "C", "D", "F")

最初の質問:どちらが重複していますか?-vec1の場合は「A」と「C」に答え、vec2の場合は0と答えます。

2番目の質問:順序に関係なく、vec1であるが、vec2にはないものを特定します(回答「E」)

またはその逆(「F」と答える)

which(vec1 !=vec2)
which(vec2 !=vec1)

[1] 3 4 5 7
Warning message:
In vec1 != vec2 :
  longer object length is not a multiple of shorter object length

それは私が期待したものではありません....

4

3 に答える 3

4

最初の質問については、試してみてください?duplicated

vec1.dup <- duplicated(vec1)
unique(vec1[vec1.dup])

[1] "A" "C"

2 つ目は、 を試してください?setdiff。vec1 にない vec2 の値が必要です。

setdiff(vec2, vec1)
[1] "F"
于 2012-07-05T01:40:49.583 に答える
3

重複する vec1 の要素:

vec1[duplicated(vec1)]

[1] "A" "C"

vec2 にない vec1 の要素:

vec1[is.na(match(vec1,vec2))]

[1] "E"

およびその逆:

vec2[is.na(match(vec1,vec2))]

[1] "F"
于 2012-07-05T01:38:51.383 に答える
3

あなたの(2番目の)質問は..なぜですか?(正しい答えが得られたようですが...どのように?)

which(vec1 !=vec2)
which(vec2 !=vec1)

両方とも戻る

[1] 3 4 5 7

答えの大部分は、含めなかった警告メッセージにあります。

Warning message:
In vec1 != vec2 :
  longer object length is not a multiple of shorter object length

「!=」のような 2 項演算子がベクトルで機能する場合、リサイクル ルールが引き継がれるため、2 つのベクトルのうち長い方が比較の「範囲」を決定し、短い方はリサイクルによって拡張されます。あなたはテストすることになります:

> c("A", "B", "C", "D", "F", "A", "B") != c("A", "B", "D", "C", "E", "A", "C")
                                         #.... extending shorter one ^^^^^^^
[1] FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
> c("A", "B", "D", "C", "E","A", "C") !=  c("A", "B", "C", "D", "F", "A", "B")
#.... extending shorter one ^^^^^^^
[1] FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
于 2012-07-05T02:58:03.897 に答える