我需要将索引列表应用于一对一映射的数据帧列表。索引列表的第一个元素仅转到第一个数据帧,依此类推。索引列表适用于数据帧中的行。 并且需要通过选择索引列表中未提及的行来创建互补数据框的列表。
以下是一些示例数据:
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]],])
有人可以提出更好,更优雅的东西吗?
答案 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