编写一个函数,根据数据框的列值在矩阵中查找元素

时间:2018-04-17 18:44:29

标签: r matrix dplyr distance

我有一个数据框,其原点和目的地名称如下(我将简化以使其更清晰):

Origin Dest Time 
     A    B  Mon
     B    C  Wed
     C    B  Fri

我还有一个距离矩阵,用于查找地点ABC之间的距离。

   A  B  C
A  0  8 11
B  8  0  6
C 11  6  0

我如何从距离矩阵中提取距离并将其输入到数据帧的每一行的单独列(例如df$Distance)中?

2 个答案:

答案 0 :(得分:6)

通过矩阵索引(使用Roman的数据)的力量:

mt[as.matrix(xy[c("Origin","Dest")])]
#[1] 8 6 6

这可以通过将OriginDest与距离矩阵的rownamescolnames相匹配来实现。

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