我有一个数据框,其原点和目的地名称如下(我将简化以使其更清晰):
Origin Dest Time
A B Mon
B C Wed
C B Fri
我还有一个距离矩阵,用于查找地点A
,B
和C
之间的距离。
A B C
A 0 8 11
B 8 0 6
C 11 6 0
我如何从距离矩阵中提取距离并将其输入到数据帧的每一行的单独列(例如df$Distance
)中?
答案 0 :(得分:6)
通过矩阵索引(使用Roman的数据)的力量:
mt[as.matrix(xy[c("Origin","Dest")])]
#[1] 8 6 6
这可以通过将Origin
和Dest
与距离矩阵的rownames
和colnames
相匹配来实现。
答案 1 :(得分:3)
您可以将数据重排为长格式,并根据Origin和Dest进行合并。
# prepare data
xy <- data.frame(Origin = c("A", "B", "C"),
Dest = c("B", "C", "B"),
Time = c("Mon", "Wed", "Fri"))
mt <- matrix(c(0,8,11,
8,0,6,
11,6,0), byrow = TRUE, ncol = 3)
colnames(mt) <- c("A", "B", "C")
rownames(mt) <- c("A", "B", "C")
mt <- data.frame(mt)
library(tidyr)
# we need "id" column to reflow to long format
mt$Origin <- rownames(mt)
mt <- gather(mt, key = Dest, value = value, -Origin) # reflow data to long format
# merge based on origin and destination
merge(xy, mt, by = c("Origin", "Dest"))
Origin Dest Time value
1 A B Mon 8
2 B C Wed 6
3 C B Fri 6