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