【问题标题】:r data.table - conditionally writing to external filer data.table - 有条件地写入外部文件
【发布时间】:2021-09-04 18:22:53
【问题描述】:

是否可以从 data.table 有条件地写入外部文件?目前使用基本的for循环,然后访问行/列,但速度很慢。

for (row in seq_len(nrow(dt))) {    

   <if - else condition by accessing row and column as dt[row, column]>

    write(<text>, file=<file>, append=append)
}

条件非常复杂,不容易转换,然后使用 fwrite 将 data.table 中的输出转储到外部文件中(假设这是最快的选项)

我只是想知道 data.table 支持“set”是否会比基本 for 循环更快(来自以下博客之一的示例)但是我们如何从 data.table 的“set”执行 fwrite() ?

dt <- data.table(mtcars)[,1:5, with=F]
for (j in c(1L,2L,4L)) set(dt, j=j, value=-dt[[j]]) # integers using 'L' passed for efficiency
for (j in c(3L,5L)) set(dt, j=j, value=paste0(dt[[j]],'!!'))
head(dt)

【问题讨论】:

  • 坦率地说,我怀疑逐行执行此操作的效率(从 R 效率)尽可能低。我建议一步完成你的if,然后一步写出结果行。我也看不到您的第一个块(遍历行,一次写入一行)与您的第二个块(遍历列,set 以适当地更新每一列)相关。两者有什么关系?最后,您需要对dt&lt;file&gt; 进行什么操作?
  • @r2evans 代码在两个块中显示仅供参考,我同意一个是按行,另一个是按列。我更多的是逐行寻找解决方案。我没有探索处理 data.table 中的所有内容然后使用 fwrite() 转储输出的选项。

标签: r data.table


【解决方案1】:

我们只需要阻止{}中的代码,即在我们应用set之后,原始数据集'dt'被更新。然后,我们在转换后的数据集上使用fwrite 并使用新文件名

library(data.table)
for(i in seq_len(nrow(dt))) {
  for (j in c(1L,2L,4L)) {
     set(dt, i = i, j=j, value=-dt[[j]][i])
     fwrite(dt, 'yourfile.csv', append = TRUE)
}
}

【讨论】:

  • 谢谢,我的情况是在行级别获得控制,然后有条件地处理然后将该行的内容写入 CSV 文件。即一次处理一行
  • @R007 你想在哪里写fwrite。在所有处理之后它只是一个文件吗?然后,您可以在循环外执行fwrite。您的代码`write(&lt;text&gt;, file=&lt;file&gt;, append=append 表明它是在循环中编写的
  • 是单个文件。我使用 write() 和 append=TRUE
  • @R007 然后,只需在更新中更改文件名,即单个文件名并使用append = TRUEfwrite 中也有)
  • @R007 如果循环遍历行,则未指定 i
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 2017-06-08
  • 2014-05-04
  • 2018-07-29
  • 2021-06-06
  • 1970-01-01
  • 2019-05-27
  • 2021-03-08
相关资源
最近更新 更多