2012-12-06 38 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

相關問題