【问题标题】:subsetting a data.frame using a for loop使用 for 循环对 data.frame 进行子集化
【发布时间】:2016-11-03 17:51:38
【问题描述】:

我有一个 data.frame,我想每 10 行对其进行一次子集化,然后对子集应用一个函数,保存对象,然后删除前一个对象。这是我到目前为止得到的结果

L3 <- LETTERS[1:20]
df <- data.frame(1:391, "col", sample(L3, 391, replace = TRUE))
names(df) <- c("a", "b", "c")

b <- seq(from=1, to=391, by=10)
nsamp <- 0
for(i in seq_along(b)){
a <- i+1
nsamp <- nsamp+1
df_10 <- df[b[nsamp]:b[a], ]
res <- lapply(seq_along(df_10$b), function(x){...}
saveRDS(res, file="res.rds")
rm(res)
}

我的问题是for loop 在到达序列的最后一个元素b 时崩溃

【问题讨论】:

  • 为什么要保存在 for 循环中?您似乎一次又一次地保存同一个文件,因为您没有更改文件的名称。关闭 Lapply 功能。
  • 该函数读取一些非常大的文件,这就是为什么我想以 10 个为一组,然后保存并删除它们以节省 RAM
  • 对象是否太大以至于无法全部放入内存?更好的方法是使用列表(例如,my_subsets = split(df, 1:nrow(df) %/% 10) 然后lapplyfor 循环子集)或更好,使用data.tabledplyr 与他们的“按组做事”能力。
  • 该函数使用 data.frame s2c_10 上的信息来应用 'sleuth` 包中的函数,该函数读取 hdf5 这么大的文件,所以这就是我要应用的原因块的功能。感谢@Gregor 使用 split
  • @Gregor,如果您使用split 详细说明答案,我会接受它

标签: r for-loop


【解决方案1】:

分区数据时,split 是您的朋友。它将创建一个列表,其中每个数据子集作为一个项目,然后很容易迭代。

dfs = split(df, 1:nrow(df) %/% 10)

然后你的 for 循环可以简化成这样的东西(未经测试......我不确定你在做什么,因为示例数据似乎从 df 切换到 sc2_10 我只希望你的专栏名为b 的向量与名为b 的向量不同):

for(i in seq_along(dfs)){
  res <- lapply(seq_along(dfs[[i]]$b), function(x){...}
  saveRDS(res, file = sprintf("res_%s.rds", i))
  rm(res)
}

我还修改了你的保存文件名,这样你就不会每次都覆盖同一个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多