R 在已排序的数据帧列表中查找元素的平均位置

R 在已排序的数据帧列表中查找元素的平均位置,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个很大的数据帧列表。每个元素都包含相同数量和组的元素。它们只是以一种不同的方式排序,就像这样 df1 ID |分数 x | 1.59 y | 1.38 z | 1.2 df2 ID |分数 y | 1.32 x | 1.23 z | 1.08 我想做的是分析每个元素的位置是如何从一个数据帧变化到另一个数据帧的 为此,我首先需要提取每个数据帧中元素的位置 我设想这样的输出 ID |在df1中的位置|在df2中的位置|等 x | 1 | 2 |等 y | 2 | 1 |等 z | 3 | 3

我有一个很大的数据帧列表。每个元素都包含相同数量和组的元素。它们只是以一种不同的方式排序,就像这样

df1

ID |分数

x | 1.59

y | 1.38

z | 1.2

df2

ID |分数

y | 1.32

x | 1.23

z | 1.08

我想做的是分析每个元素的位置是如何从一个数据帧变化到另一个数据帧的

为此,我首先需要提取每个数据帧中元素的位置

我设想这样的输出

ID |在df1中的位置|在df2中的位置|等

x | 1 | 2 |等

y | 2 | 1 |等

z | 3 | 3 |等

所以我想要的是所有数据帧中每个特定元素的行号。 关于如何实现这一点有什么想法吗

# sample data
my_list <- list(
  df1 = data.frame(ID = c("x", "y", "z"), Score = c(1,2,3)),
  df2 = data.frame(ID = c("y", "x", "z"), Score = c(4,5,6))
)

# for a df, return data.frame with ID and column with element name giving position

row_positions <- function(data, df) { 
  data[[df]] <- 1:nrow(data)
  data[,c("ID", df)]
}

# merge across row_position output for each element

Reduce(
  merge,
  mapply(
    FUN = row_position,
    data = my_list,
    df = names(my_list),
    SIMPLIFY = FALSE
  )
)

  ID df1 df2
1  x   1   2
2  y   2   1
3  z   3   3


但是,如果上述条件不成立,这将无法按预期工作。请注意,使用第二种方法将ID编码为行名。

请分享一个可重复的小示例-可能是一个包含2个数据帧的列表,每个数据帧包含3个元素。共享代码以模拟伪数据,或者使用
dput()
共享R会话中的对象。
sapply(
  my_list,
  FUN = function(data) { 
    x <- 1:nrow(data)
    names(x) <- data$ID
    x[order(names(x))]
  }
)

  df1 df2
x   1   2
y   2   1
z   3   3