在给定特定条件的情况下,使用表(或矩阵)中的值填充列

时间:2017-07-17 21:17:24

标签: r

我不确定这会被称为什么,所以我很难找到它。对不起,如果这是一个重复的问题,那就是原因。

我有一个数据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

我确信这很简单,但我知道该怎么称呼它并且显然忘记了怎么做!

1 个答案:

答案 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