【问题标题】:write a for loop to automatically create subsets of datasets in r编写一个 for 循环以在 r 中自动创建数据集的子集
【发布时间】:2018-01-14 13:10:32
【问题描述】:

请帮助我,因为我是 R 新手,同时也是编程新手

我正在尝试编写一个循环,以便它应该读取每 1000 行的数据并在 r 中创建一个数据集

下面是我的试验

for(i in 0:nl){
  df[i] = fread('RM.csv',skip = 1000*i, nrows =1000,
                col.names = colnames(read.csv('RM.csv', nrow=1, header = T)))
}

其中nl 是一个整数,等于数据长度'RM.csv'

我要做的是创建一个函数,该函数将跳过每 1000 行并读取接下来的 1000 行,并在达到原始数据长度 nl 时终止。

现在不再强制只使用这种方法。

【问题讨论】:

标签: r function loops for-loop


【解决方案1】:

您可以尝试将整个文件读入单个数据框,然后对您不想要的行进行子集化:

df <- read.csv('RM.csv', header=TRUE)
y <- seq(from = 0, to = 100000, by = 1)     # replace the 'to' value with a value
seq.keep <- y[floor(y / 1000) %% 2 == 0]    # large enough for the whole file
df.keep <- df[seq.keep, ]

这是一个比较杂乱的demo,说明上面的顺序逻辑是正确的:

Demo

您可以检查生成的序列是:

0-999
2000-2999
4000-4999
etc.

如代码注释中所述,请确保生成的序列足够大以容纳数据框的实际大小。

如果您需要继续当前的方法,请尝试每隔 1000 行读取一次,例如

sq <- seq(from=0, to=nl, by=2)
names <- colnames(read.csv('RM.csv', nrow=1, header=TRUE))
for(i in sq) {
    df_i <- fread('RM.csv', skip=1000*i, nrows=1000, col.names=names)
    # process this chunk and move on
}

【讨论】:

  • 文件大小为 20 GB。因此,如果我尝试一次读取全部数据,系统将会崩溃。因此,我想稍后读取大量数据并执行匹配功能。一切完成后,它将写入数据并开始读取下一个块,依此类推。
  • @user3301082 我更新了我的答案。然后继续使用您当前的方法,但使用以您要读取的行为目标的序列来读取文件。
  • 更新的代码抛出错误:找不到对象'df'。但是当我将 df[i] 更改为 df_i 时,循环以无限循环结束。
  • 我不认为无限循环是可能的,但也许循环只是需要很长时间才能运行。在 R 中处理 20GB 的数据可能需要一段时间。尝试将循环的边界更改为较小的数字来验证这一点。
  • 最初我使用一个大小为 5MB、有 30,000 行的小文件运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2019-01-02
  • 1970-01-01
  • 2022-08-24
  • 2020-03-01
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多