我不确定这会被称为什么,所以我很难找到它。对不起,如果这是一个重复的问题,那就是原因。
我有一个数据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
我确信这很简单,但我知道该怎么称呼它并且显然忘记了怎么做!
答案 0 :(得分:2)
有几种选择。
如果没有转换为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