3

私は2つのベクトルを持っています:

A <- c(1,3,5,6,4,3,2,3,3,3,3,3,4,6,7,7,5,4,4,3) # 7 unique values
B <- c("a","b","c","d","e","f","g")   # 7 different values

Aの最小値がBから最初の値を取得し、最大値に続くように、Bの値をAに一致させたいと思います。

上記の例は次のようになります。

A:        1 3 5 6 4 3 2 3 3 3 3 3 4 6 7 7 5 4 4 3
assigned: a c e f d c b c c c c c d f g g e d d c
4

3 に答える 3

6

これを試して:

A <- c(1,3,5,6,4,3,2,3,3,3,3,3,4,6,7,7,5,4,4,3)
B <- letters[1:7]

B[match(A, sort(unique(A)))]
#  [1] "a" "c" "e" "f" "d" "c" "b" "c" "c" "c" "c" "c" "d" "f" "g"
# [16] "g" "e" "d" "d" "c"
于 2012-12-07T16:41:41.017 に答える
3

@JoshO'Brienが対処する一般的なケースを処理する別のオプションは

B[as.numeric(factor(A))]
# [1] "a" "c" "e" "f" "d" "c" "b" "c" "c" "c" "c" "c" "d"
# [14] "f" "g" "g" "e" "d" "d" "c"

A2<-ifelse(A > 4, A + 1, A)
# [1] 1 3 6 7 4 3 2 3 3 3 3 3 4 7 8 8 6 4 4 3
B[as.numeric(factor(A2))]
# [1] "a" "c" "e" "f" "d" "c" "b" "c" "c" "c" "c" "c" "d"
# [14] "f" "g" "g" "e" "d" "d" "c"

ただし、次のベンチマークは、このメソッドが @JoshOBrien のものよりも遅いことを示しています。

library(microbenchmark)
B <- make.unique(rep(letters, length.out=1000))
A <- sample(seq_along(B), replace=TRUE)
unique_sort_match <- function() B[match(A, sort(unique(A)))]
factor_as.numeric <- function() B[as.numeric(factor(A))]
bm<-microbenchmark(unique_sort_match(), factor_as.numeric(), times=1000L)
plot(bm)

ここに画像の説明を入力

于 2012-12-07T19:15:40.453 に答える
2

@ Joshの回答のコメントを詳しく説明するには:

Aが実際に の要素の順列を表す場合B (つまり、1inAが の最初の要素を表しB4inAが の 4 番目の要素を表すBなど)、@Matthew Plourde が指摘するように、単純AにへのインデックスB:

B[A]

A が B の順列を表していない場合は、@Josh によって提案された方法を使用する必要があります

于 2012-12-07T18:35:11.537 に答える