![](/img/trans.png)
[英]R: Efficient construct a matrix from a vector and fill it with certain conditions
[英]Fill a column with values from a table (or matrix) given certain conditions
我不確定這將被稱為什么,所以我正在努力尋找它。 抱歉,如果這是一個重復的問題,那就是為什么。
我有一個數據43x17數據矩陣,我們稱其為A,在“站點”列中具有四個級別。 我還有另一個4x3矩陣,其中包含每個站點的坐標,我們稱其為B。我想在A中創建一列,為每個站點分配B中列出的坐標。
以下面的數據為例,我想在A中創建一個新列,並使用來自Coordinate1(在B中)的值和關聯的“站點”值填充它。
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
我敢肯定這很簡單,但是我在稱呼它什么方面空白了,顯然已經忘記了怎么做!
有幾種選擇。
如果不轉換為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
或者,綁定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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.