3

这是关于 R 中效率的问题。我有两个带有names属性的数值向量,我想根据 common 有效地将一个向量的值分配给另一个向量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

第二个向量定义为:

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(a) %in% names(b)] <- b[names(a[names(a) %in% names(b)])]
于 2013-08-08T15:06:55.427 回答
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 回答
0

为您提供 1 条衬里:

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