簡體   English   中英

在特定條件下,用表(或矩陣)中的值填充列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM