根据向量的内容在列表中设置数据帧

时间:2015-01-28 15:23:40

标签: r list subset

我有一个包含五个数据帧的列表。每个数据框包含一个维列和4个值列。我想根据向量的内容对列表中的每个数据帧进行子集化。

df <- data.frame(x = 1:100, y2 = runif(100, 0, 100), y3 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100))
df2 <- data.frame(x = 1:100, y2 = runif(100, 0, 100), y3 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100))
df3 <- data.frame(x = 1:100, y2 = runif(100, 0, 100), y3 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100))
df4 <- data.frame(x = 1:100, y2= runif(100, 0, 100), y4 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100))
df5 <- data.frame(x = 1:100, y2= runif(100, 0, 100), y4 = runif(100, 0, 100), y4 = runif(100, 0, 100), y5 = runif(100,0,100))
frames <- list(df, df2, df3, df4, df5)

所以在这个例子中,我的列表是“frames”。假设我有以下向量:

subs <- 50:60

我的目标是对数据帧列表进行子集化,使得每个数据帧仅包含第一个colunmn的值在subs向量内的行。

有什么建议吗?

谢谢, 本

3 个答案:

答案 0 :(得分:4)

在我看来,几乎所有的问题都是关于具有相同列的数据框列表,这导致您在每个操作上使用lapply循环(这看起来非常低效)。

或者,您可以通过简单地将所有列表绑定到单个对象中,同时保持每个data.frame的ID来完成大部分操作的矢量化,并且在完成所有数据操作后,您可以使用{{}将它们拆分回列表中。 1}}。

以下是使用split s development version on Github的示例(您可以使用data.table获得类似的结果)

dplyr::unnest

最终(在完成所有数据操作之后)你将只做

library(data.table)
Res <- rbindlist(frames, idcol = "ID")[x %between% subs]
#     ID  x        y2       y3        y4       y5
#  1:  1 50 54.692889 58.51886 12.754368 35.61516
#  2:  1 51 21.206308 12.77442 52.440787 93.67734
#  3:  2 50 12.655685 84.55044  3.194644 54.46706
#  4:  2 51 83.840276 61.32614 61.139038 92.39402
#  5:  3 50 54.847797 20.68419 19.585931 48.87072
#  6:  3 51 75.510691 68.17955 98.696579 91.48688
#  7:  4 50 63.203071 95.94132 41.835923 60.68250
#  8:  4 51 75.481676 51.67619 80.393557 24.48381
#  9:  5 50 65.744847 50.36983 86.548843 83.31730
# 10:  5 51  4.956835 57.25666 27.106395 32.92020

为了将data.frames带回列表

答案 1 :(得分:1)

您可以尝试lapply

lapply(frames, function(.dat) .dat[with(.dat, x %in% subs),])

答案 2 :(得分:1)

如果你的第一列都是x,你可以在框架上使用 lapply

lapply(frames,function(p){p[p$x %in% subs,]})