2012-12-06 33 views
1

我有两个大的载体:分配值较小数量为越大的值的数目中的R

A: https://dl.dropbox.com/u/22681355/A.csv 
B: https://dl.dropbox.com/u/22681355/B.csv 

A具有超过20000的条目,但只有1350唯一条目。 B是从1到9生成的随机数,正好是1350次

我想从B分配A值,使A中的相同值在B中得到相同的值。如果有多个1的每1应从B.

得到相同的号码,我已经使用A [B]命令,但第一万八入境后,我得到的NA

什么是这样做的正确方法?

代码:

A<-read.csv("A.csv") 
B<-read.csv("B.csv") 

A[B] 
+0

你试过'merge()'吗? – Andrie

+0

合并将不会分配相同的值相同的数字。例如。如果有四个1,那么这四个中的每一个都应该从B – user1723765

+0

'merge()'得到相同的数字,如果你探索'all.x = TRUE'参数。 – Andrie

回答

1
  1. read.csv()创建一个数据帧,而不是一个矢量。
  2. 您可能的意思是B[A]对于A中的每个元素,该元素的值的索引处获得B的值。由于A的值范围从1到1899,它超过了B的1349的大小。对于那些B以外的元素,引入了NAs。

正确的方法做你想要达到的目标是

A = read.table("http://dl.dropbox.com/u/22681355/A.csv") 
B = read.table("http://dl.dropbox.com/u/22681355/B.csv") 
A = A$V1 
B = B$V1 
A = as.factor(A) 

B[match(A,levels(A))] 

match(A,levels(A))将返回相同长度的向量为A,对于每一个元素包含的元素在其系数的位置水平,即1至1350之间的数字(1350个不同值)。如果A是as.factor(c(1,1,3,5,5,7)),levels(A)将是c(1,3,5,7)而且match(A,levels(A))将是c(1,1,2,3,3,4),即元素在其级别中的位置。

+0

为什么我必须使它成为1350?我不明白。 – user1723765

+0

我的错误。从你的问题,我认为这些文件是CSV格式,但他们不是。我修改了我的答案。 – Uli

+0

解决了,谢谢! – user1723765

相关问题