编写一个函数,根据数据框列的值在矩阵中查找元素
Writing a function that looks for element in a matrix based on values of columns of data frame
我有一个包含起点和终点名称的数据框,如下所示(我将简化以使其更清楚):
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
)中?
您可以将数据重排为长格式并根据 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
借助矩阵索引的力量(使用 Roman 的数据):
mt[as.matrix(xy[c("Origin","Dest")])]
#[1] 8 6 6
这通过将 Origin
和 Dest
与距离矩阵的 rownames
和 colnames
匹配来实现。
我有一个包含起点和终点名称的数据框,如下所示(我将简化以使其更清楚):
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
)中?
您可以将数据重排为长格式并根据 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
借助矩阵索引的力量(使用 Roman 的数据):
mt[as.matrix(xy[c("Origin","Dest")])]
#[1] 8 6 6
这通过将 Origin
和 Dest
与距离矩阵的 rownames
和 colnames
匹配来实现。