【问题标题】:Finding the average position of an element within a list of sorted dataframes在排序的数据框列表中查找元素的平均位置
【发布时间】:2020-10-21 14:57:58
【问题描述】:

我有大量数据框。它们中的每一个都包含相同数量和相同的元素组。它们只是以不同的方式排序。

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 |等等

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

【问题讨论】:

  • 请分享一个可重复的小例子——也许是一个包含 2 个数据框的列表,每个数据框有 3 个元素。共享代码以模拟虚假数据,或使用 dput() 共享 R 会话中的对象。

标签: r dataframe dplyr


【解决方案1】:
# 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

使用mapply 是因为应用函数通常无法访问它们所引用的元素的名称。

如果您知道所有 data.frame 对象包含相同的元素计数和 ID,只是顺序不同,您可以使用更简单的逻辑:

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

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

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 2023-03-29
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多