将索引列表应用于数据框列表

时间:2019-10-29 04:49:16

标签: r

我需要将索引列表应用于一对一映射的数据帧列表。索引列表的第一个元素仅转到第一个数据帧,依此类推。索引列表适用于数据帧中的行。 并且需要通过选择索引列表中未提及的行来创建互补数据框的列表。

以下是一些示例数据:

set.seed(1)
A <- data.frame(matrix(rnorm(40,0,1), nrow = 10))
B <- data.frame(matrix(rnorm(40,2,3), nrow = 10))
C <- data.frame(matrix(rnorm(40,3,4), nrow = 10))

dflis <- list(A,B,C)

# Create a sample row index
ix <- lapply(lapply(dflis,nrow), sample, size = 6)

到目前为止,我已经管理了此有效但外观难看的代码:

dflis.train <- lapply(seq_along(dflis), function(x) dflis[[x]][ix[[x]],])

dflis.test <- lapply(seq_along(dflis), function(x) dflis[[x]][-ix[[x]],])

有人可以提出更好,更优雅的东西吗?

1 个答案:

答案 0 :(得分:2)

使用Map / mapply而不是单变量lapply,以便您可以遍历两个对象并应用函数,例如:

Map(function(d,r) d[r,], dflis, ix)

或者,如果您想花哨的话:

Map(`[`, dflis, ix, TRUE)

匹配您要求的答案。

identical(
  Map(function(d,r) d[r,], dflis, ix),
  lapply(seq_along(dflis), function(x) dflis[[x]][ix[[x]],])
)
#[1] TRUE