2017-07-17 21 views
1

我不確定這將被稱爲什麼,所以我努力尋找它。對不起,如果這是一個重複的問題,那將是原因。在給定的條件下用表格(或矩陣)中的值填充列

我有一個數據43x17數據矩陣,可以稱之爲A,在「站點」列中有四個級別。我還有另一個包含每個站點座標的4x3矩陣,我們稱它爲B.我想在A中創建一個列,其中每個站點都分配了B中列出的座標。

以下面的數據爲例,我想在A中創建一個新列,並使用Coordinate1(B中)的值和關聯的「Site」值填充它。

A <- matrix(c(1:4), nrow = 12, ncol = 3, byrow = TRUE, 
       dimnames = list(c(1:12), 
           c("Site", "D.2", "D.3"))) 
A 
B<- matrix(c(1:4), nrow = 4, ncol = 3, byrow = TRUE, 
      dimnames = list(c(1:4), 
          c("Site", "Coordinate1", "Coordinate2"))) 
B 

我敢肯定這很簡單,但是我對這個稱呼很清楚,並且顯然忘記了如何去做!

+2

的順序也應該給予所需的輸出。看起來你只是想要一個簡單的合併?可能的重複:https://stackoverflow.com/questions/1299871/how-to-join-merge-data-frames-inner-outer-left-right(你可能想要使用data.frames而不是矩陣)。 – MrFlick

+0

我對任何數據結構都開放,矩陣似乎是最容易拋出可重複代碼的。 我試過了@coffeinjunky建議的cbind代碼,但是在新列中獲得了所有的NAs。在兩位數據之間不應該有任何沒有匹配站點值的行,所以我不確定這是從哪裏來的 – Jesse001

+2

如果你打開任何數據結構,使用'data.frame'並使用'merge' 。 – coffeinjunky

回答

1

有幾種選擇。

沒有轉換爲data.frame,並使用merge()在大多數的意見建議,您可以嘗試使用match()cbind()

cbind(A, B[match(A[, "Site"], B[, "Site"]), "Coordinate1", drop = FALSE]) 
Site D.2 D.3 Coordinate1 
1  1 2 3   2 
2  4 1 2   1 
3  3 4 1   4 
4  2 3 4   3 
5  1 2 3   2 
6  4 1 2   1 
7  3 4 1   4 
8  2 3 4   3 
9  1 2 3   2 
10 4 1 2   1 
11 3 4 1   4 
12 2 3 4   3 

,或者到cbind所有列B

cbind(A, B[match(A[, "Site"], B[, "Site"]), ]) 
Site D.2 D.3 Site Coordinate1 Coordinate2 
1  1 2 3 1   2   3 
2  4 1 2 4   1   2 
3  3 4 1 3   4   1 
4  2 3 4 2   3   4 
5  1 2 3 1   2   3 
6  4 1 2 4   1   2 
7  3 4 1 3   4   1 
8  2 3 4 2   3   4 
9  1 2 3 1   2   3 
10 4 1 2 4   1   2 
11 3 4 1 3   4   1 
12 2 3 4 2   3   4 

轉換爲data.frame和merge()

as.matrix(merge(data.frame(A), data.frame(B), by = "Site", sort = FALSE)) 

扭曲行的原始順序:

 Site D.2 D.3 Coordinate1 Coordinate2 
[1,] 1 2 3   2   3 
[2,] 1 2 3   2   3 
[3,] 1 2 3   2   3 
[4,] 4 1 2   1   2 
[5,] 4 1 2   1   2 
[6,] 4 1 2   1   2 
[7,] 3 4 1   4   1 
[8,] 3 4 1   4   1 
[9,] 3 4 1   4   1 
[10,] 2 3 4   3   4 
[11,] 2 3 4   3   4 
[12,] 2 3 4   3   4 

使用從一data.table包加入維持行

library(data.table) 
as.matrix(data.table(B)[data.table(A), on = "Site"]) 
 Site Coordinate1 Coordinate2 D.2 D.3 
[1,] 1   2   3 2 3 
[2,] 4   1   2 1 2 
[3,] 3   4   1 4 1 
[4,] 2   3   4 3 4 
[5,] 1   2   3 2 3 
[6,] 4   1   2 1 2 
[7,] 3   4   1 4 1 
[8,] 2   3   4 3 4 
[9,] 1   2   3 2 3 
[10,] 4   1   2 1 2 
[11,] 3   4   1 4 1 
[12,] 2   3   4 3 4