2017-01-05 63 views
0

我試圖構造一個表C,它根據另外兩個表A中給出的「地址」從一組矩陣X,Y和Z獲取值, B.從基於R中其他兩個表的地址獲取值

要做到這一點,我首先加入ID列表A和B:

A$A.ID <- seq.int(nrow(A)) 
B$B.ID <- seq.int(nrow(B)) 

使用,發現該ID的所有排列:

C <- expand.grid(A$A.ID, B$B.ID) 

現在我想添加一列X,Y和Z到C,但不知道我在做什麼(編程相當新穎:/)

解釋我繪製過程的過程。希望它可以幫助...

enter image description here

讓我知道如果你需要知道的一切。

+0

我知道這可能是一個正確的痛苦,但如果你能提供A/B/X/Y/Z的可重複的例子和預期結果的C(數據集可能只有3或4行),你會更有可能在答案中獲得代碼。 – thelatemail

回答

1

我認爲這個模式符合你描述的模式。首先,這裏的一些示例性數據:

A <- data.frame(A.ID=1:2, X=1:2, Y=3:2, Z=2:1) 
B <- data.frame(B.ID=1:2, X=1:2, Y=2:1, Z=1:2) 

A;B 
# A.ID X Y Z 
#1 1 1 3 2 
#2 2 2 2 1 

# B.ID X Y Z 
#1 1 1 2 1 
#2 2 2 1 2 

X <- matrix(1:9,nrow=3); Y <- matrix(1:16,nrow=4); Z <- matrix(1:4,nrow=2) 
X;Y;Z 
#  [,1] [,2] [,3] 
#[1,] 1 4 7 
#[2,] 2 5 8 
#[3,] 3 6 9 

#  [,1] [,2] [,3] [,4] 
#[1,] 1 5 9 13 
#[2,] 2 6 10 14 
#[3,] 3 7 11 15 
#[4,] 4 8 12 16 

#  [,1] [,2] 
#[1,] 1 3 
#[2,] 2 4 

然後一束Map平所需的索引中的一個矩陣,它用於子集中的每個所述X/Y/Z對象:

arep <- rep(1:nrow(A),nrow(B)) 
brep <- rep(1:nrow(B),each=nrow(A)) 
cells <- Map(
    `[`, 
    list(X=X,Y=Y,Z=Z), 
    Map(function(x,y) t(mapply(c,x,y)), A[arep,-1], B[brep,-1]) 
) 

data.frame(A["A.ID"][arep,,drop=FALSE], B["B.ID"][brep,,drop=FALSE], cells) 
# A.ID B.ID X Y Z 
#1  1 1 1 7 2 
#2  2 1 2 6 1 
#1.1 1 2 4 3 4 
#2.1 2 2 5 2 3 
+0

'下標越界'可能是指試圖選擇比它匹配的「X/Y/Z」矩陣更大的行/列組合。 'mapply'錯誤可能是因爲'A'和'B'沒有相同的行數。有很多原因可能導致這些錯誤被拋出,但這是一些想法。 – thelatemail

+0

嘿,謝謝你, 對不起,再次糾纏你,但我也注意到,data.frame函數在最後沒有A.ID和B.ID的排列,那麼它們對應的X,Y和Z值? 它看起來像你的例子中的結果只是與n對齊。 我認爲應該是這樣的 ABXYZ 結果(1,1,1,7,2) (1,2,4,3,4) (2,1,2,6,1) (2,2,5,2,3) 我試着用expand.grid在data.frame命令中產生這個,但是這也不起作用。我應該生成這個列表,然後附上這個映射的結果嗎? –

+0

@LevonRush - 編輯修復您的問題 – thelatemail

相關問題