R - 从 data.frames 列表中提取信息

pun*_*n11 3 r list subset dataframe

我有两个需求,都连接到一个类似于下面可重现的数据集。我有一个 18 个实体的列表,每个实体由 17-19 个 data.frames 的列表组成。可重现的数据集如下(有矩阵而不是 data.frames,但我认为这没有区别):

test <- list(list(matrix(10:(50-1), ncol = 10), matrix(60:(100-1), ncol = 10), matrix(110:(150-1), ncol = 10)),
             list(matrix(200:(500-1), ncol = 10), matrix(600:(1000-1), ncol = 10), matrix(1100:(1500-1), ncol = 10)))
Run Code Online (Sandbox Code Playgroud)
  1. 我需要将每个数据帧/矩阵分为两部分(按给定的行数)并保存到新的列表列表中
  2. 其次,我需要从data.frame列表列表中的每一列中提取并保存给定的列。

除了for(),我不知道如何去做,但我相信它应该可以与apply()函数系列一起使用。

感谢您阅读

编辑:

我的预期输出如下所示:

extractedColumns <- list(list(matrix(10:(50-1), ncol = 10)[, 2], matrix(60:(100-1), ncol = 10)[, 2], matrix(110:(150-1), ncol = 10)[, 2]),
                         list(matrix(200:(500-1), ncol = 10)[, 2], matrix(600:(1000-1), ncol = 10)[, 2], matrix(1100:(1500-1), ncol = 10)[, 2]))


numToSubset <- 3
substetFrames <- list(list(list(matrix(10:(50-1), ncol = 10)["first length - numToSubset rows", ], matrix(10:(50-1), ncol = 10)["last numToSubset rows", ]), 
                           list(matrix(60:(100-1), ncol = 10)["first length - numToSubset rows", ], matrix(60:(100-1), ncol = 10)["last numToSubset rows", ]),
                                list(matrix(110:(150-1), ncol = 10)["first length - numToSubset rows", ], matrix(110:(150-1), ncol = 10)["last numToSubset rows", ])),
                      etc...)
Run Code Online (Sandbox Code Playgroud)

看起来很乱,希望你能按照我的要求去做。

Lyz*_*deR 5

您可以使用两个嵌套的lapplys:

lapply(test, function(x) lapply(x, '[', c(2, 3)))
Run Code Online (Sandbox Code Playgroud)

输出:

[[1]]
[[1]][[1]]
[1] 11 12

[[1]][[2]]
[1] 61 62

[[1]][[3]]
[1] 111 112


[[2]]
[[2]][[1]]
[1] 201 202

[[2]][[2]]
[1] 601 602

[[2]][[3]]
[1] 1101 1102
Run Code Online (Sandbox Code Playgroud)

解释

第一个lapply将应用于test. 这两个列表中的每一个都包含另外 3 个。第二个lapply将迭代这 3 个列表和子集('['即第二个中的函数lapply)列c(2, 3)

注意:在矩阵的情况下,[将对元素 2 和 3 进行子集,但在 data.frame 上使用时,相同的函数将对列进行子集。

子集行和列

lapply使用匿名函数非常灵活。通过将代码更改为:

#change rows and columns into what you need
lapply(test, function(x) lapply(x, function(y) y[rows, columns]))
Run Code Online (Sandbox Code Playgroud)

您可以指定所需的行或列的任意组合。