簡體   English   中英

循環遍歷 dataframe 中兩列的行以從矩陣中獲取值

[英]Loop through the rows of two columns in a dataframe to obtain values from a matrix

我正在 R 工作以清理一些數據以進行分析。 我有一個看起來像這樣的 dataframe (df):

Strain1 Strain2
p1      p2
p2      p3
p3      p4
p4      p5
p5      p1

和一個看起來像這樣的矩陣(distmat):

       p1     p2     p3     p4     p5
p1     0      0.1    0.3     0.4    0.9
p2     0.1     0     0.5     0.1    0.6
p3     0.3    0.5     0      0.8    0.3
p4     0.4    0.1    0.8      0     0.2
p5     0.9    0.6    0.3     0.2     0

我想在我的數據框中添加一列,該列將采用 Strain1 和 Strain2,在數據矩陣中找到值,提取值,然后將其放入新列和同一行中。 我需要為超過 1000 個數據點執行此操作。

為了參考我將從這個例子中得到的數據框:

Strain1 Strain2 dist
p1      p2       0.1
p2      p3       0.5
p3      p4       0.8
p4      p5       0.2
p5      p1       0.9

base R中的一個選項

df$dist <- mat1[as.matrix(df)]

-輸出

> df
  Strain1 Strain2 dist
1      p1      p2  0.1
2      p2      p3  0.5
3      p3      p4  0.8
4      p4      p5  0.2
5      p5      p1  0.9

數據

df <- structure(list(Strain1 = c("p1", "p2", "p3", "p4", "p5"), Strain2 = c("p2", 
"p3", "p4", "p5", "p1")), class = "data.frame", row.names = c(NA, 
-5L))

mat1 <- structure(c(0, 0.1, 0.3, 0.4, 0.9, 0.1, 0, 0.5, 0.1, 0.6, 0.3, 
0.5, 0, 0.8, 0.3, 0.4, 0.1, 0.8, 0, 0.2, 0.9, 0.6, 0.3, 0.2, 
0), dim = c(5L, 5L), dimnames = list(c("p1", "p2", "p3", "p4", 
"p5"), c("p1", "p2", "p3", "p4", "p5")))

base R中的可能解決方案:

df$dist <- apply(df, 1, \(x) mat[x[1], x[2]])
df

#>   Strain1 Strain2 dist
#> 1      p1      p2  0.1
#> 2      p2      p3  0.5
#> 3      p3      p4  0.8
#> 4      p4      p5  0.2
#> 5      p5      p1  0.9
df<-tribble(~Strain1, ~Strain2,
                "p1",      "p2",
                "p2",      "p3",
                "p3",      "p4",
                "p4",      "p5",
                "p5",      "p1")

distmat<-matrix(runif(25), nrow=5, ncol=5,
                dimnames = list(c(paste0("p", 1:5)),
                                c(paste0("p", 1:5))))

df <- df %>% 
  rowwise() %>% 
  mutate(dist = distmat[Strain2, Strain1])

在這里進行瘋狂的猜測,但是由於您將其稱為 distmat,因此也許看看 corrr package 中的便利函數shave()stretch()是否有用,將corrr減少到一個三角形並將其變為長格式。

corrr::shave(corrr::as_cordf(mat1)) %>% 
  corrr::stretch(na.rm = TRUE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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