根据成对排名计算所有项目的顺序
Calculate order of all items based on pairwise rankings
我对人的身高进行了成对比较,一个人的 ID 在 'person1' 列,另一个在 'person2' 列。 'height' 变量表示 'person1' 和 'person2' 中谁最高。如果 'height' 为 1,则 'person1' 最高。
df <- data.frame(person1 = c('A', 'C', 'B', 'D'),
person2 = c('B', 'D', 'C', 'A'),
height = c(0, 0, 0, 1))
df
# person1 person2 height
# 1 A B 0 # B is taller than A
# 2 C D 0 # D is taller than C
# 3 B C 0 # C is taller than B
# 4 D A 1 # D is taller than A
我需要从这些人与人之间的顺序联系中找出谁最高。看看这个玩具数据,我知道顺序应该是:
D, C, B, A
我的第一个想法是成功给分,然后尝试追查对方的记录,并为他们比其他人高加分。示例:
A 会从直接关系中得到 0p,因为他比 B 和 D 矮。从间接关系中他会得到 0,因为 B 比 C 矮,但会得到 1,因为 D 比 C 高。我认为一轮不是够了,但我需要像这样更进一步。
我的真实数据是多人。
一种可能是将个人的成对排名视为有向图。计算出边的度数。获取从源顶点(最大度数;最高个体)到目标顶点(度数 = 0;最短个体没有出边)的简单路径。抓住最长的路径。
library(igraph)
library(data.table)
setDT(df)
# reorder columns to reflect direction of vertices
df[height == 0, `:=`(person1 = person2, person2 = person1)]
g = graph_from_data_frame(df[ , 1:2])
deg = degree(g, mode = "out")
pth = all_simple_paths(g, from = names(deg[which.max(deg)]), to = names(deg[deg == 0]))
pth[which.max(lengths(pth))]
# [[1]]
# + 4/4 vertices, named, from 96b1b6c:
# [1] D C B A
plot(g)
我对人的身高进行了成对比较,一个人的 ID 在 'person1' 列,另一个在 'person2' 列。 'height' 变量表示 'person1' 和 'person2' 中谁最高。如果 'height' 为 1,则 'person1' 最高。
df <- data.frame(person1 = c('A', 'C', 'B', 'D'),
person2 = c('B', 'D', 'C', 'A'),
height = c(0, 0, 0, 1))
df
# person1 person2 height
# 1 A B 0 # B is taller than A
# 2 C D 0 # D is taller than C
# 3 B C 0 # C is taller than B
# 4 D A 1 # D is taller than A
我需要从这些人与人之间的顺序联系中找出谁最高。看看这个玩具数据,我知道顺序应该是:
D, C, B, A
我的第一个想法是成功给分,然后尝试追查对方的记录,并为他们比其他人高加分。示例:
A 会从直接关系中得到 0p,因为他比 B 和 D 矮。从间接关系中他会得到 0,因为 B 比 C 矮,但会得到 1,因为 D 比 C 高。我认为一轮不是够了,但我需要像这样更进一步。
我的真实数据是多人。
一种可能是将个人的成对排名视为有向图。计算出边的度数。获取从源顶点(最大度数;最高个体)到目标顶点(度数 = 0;最短个体没有出边)的简单路径。抓住最长的路径。
library(igraph)
library(data.table)
setDT(df)
# reorder columns to reflect direction of vertices
df[height == 0, `:=`(person1 = person2, person2 = person1)]
g = graph_from_data_frame(df[ , 1:2])
deg = degree(g, mode = "out")
pth = all_simple_paths(g, from = names(deg[which.max(deg)]), to = names(deg[deg == 0]))
pth[which.max(lengths(pth))]
# [[1]]
# + 4/4 vertices, named, from 96b1b6c:
# [1] D C B A
plot(g)