3

これは R の効率に関する問題です。属性を持つ 2 つの数値ベクトルがnamesあり、共通に基づいて一方のベクトルの値を他方のベクトルに効率的に割り当てたいと考えていますnames

たとえば、最初のベクトルは次のように定義されます。

set.seed(1);
a<-rep(NA,10);
names(a)<-1:10;
d<-a;  #  we will need this later 
a

 1  2  3  4  5  6  7  8  9 10 
NA NA NA NA NA NA NA NA NA NA

2 番目のベクトルは次のように定義されます。

b<-sample(letters, 5);
names(b)<-sample(1:10, 5);
b

9  10   6   5   1 
"g" "j" "n" "u" "e" 

今、次のコードは私が望むことを正確names(b)names(a)行いaますb.

for(p in 1:length(b)){
    a[which(names(a) == names(b)[p])]<-b[p]
};

a

1   2   3   4   5   6   7   8   9  10 
"e"  NA  NA  NA "u" "n"  NA  NA "g" "j" 

私の質問は次のとおりです。これを行うためのより効率的な方法はありますか? 私ははるかに大きなベクトルを扱っており、これを行うためのより良い方法があるに違いないと考え続けています。

次のようなより洗練された方法:

d[which(names(d) %in% names(b))]<- b
d

1   2   3   4   5   6   7   8   9  10 
"g"  NA  NA  NA "j" "n"  NA  NA "u" "e"  

all.equal(a,d)

[1] "4 string mismatches"

それが必要でnames(b)ありnames(a)、最初に順序付けされるため、間違った結果が生成されます。これも最適な戦略ではないようです。

どんなアイデアでも大歓迎です!

4

5 に答える 5

3
a[intersect(names(b), names(a))] <- b[intersect(names(b), names(a))]
> a
  1   2   3   4   5   6   7   8   9  10 
"e"  NA  NA  NA "u" "n"  NA  NA "g" "j" 
于 2013-08-08T15:10:55.470 に答える
3

正解:

@flodel からのコメントに基づく

a[match(names(b), names(a))] <- b

古い答え:

これは近づく。の名前は保持されませんa。理由はわかりません。事後にの名前を再割り当てできますa

a <- b[match(names(a),names(b))]
于 2013-08-08T15:06:39.440 に答える
1

私はおそらくこれを行うでしょう:

a[names(b)] <- b
> a
#   1   2   3   4   5   6   7   8   9  10 
# "e"  NA  NA  NA "u" "n"  NA  NA "g" "j" 

bが のサブセットでない場合a、たとえば:

set.seed(45)
a <- rep(NA, 10)
names(a) <- sample(10)
#  7  3  2  9 10  8  1  5  4  6 
# NA NA NA NA NA NA NA NA NA NA 

b <- sample(letters, 5)
names(b) <- sample(1:15, 5)
#   7  14   2   5   3 
# "j" "w" "h" "k" "z" 

len <- length(a)
a[names(b)] <- b
a[1:len]
#   7   3   2   9  10   8   1   5   4   6 
# "j" "z" "h"  NA  NA  NA  NA "k"  NA  NA 
于 2013-08-08T15:07:17.610 に答える
1

これを試して:

a[names(a) %in% names(b)] <- b[names(a[names(a) %in% names(b)])]
于 2013-08-08T15:06:55.427 に答える
0

あなたのための1つのライナー:

a[as.integer(names(b))]<-b
于 2013-08-08T20:26:11.157 に答える