【问题标题】:Writing files after fread with a new name用新名称在 fread 之后写入文件
【发布时间】:2016-04-04 08:59:01
【问题描述】:

假设我有这样的文件,

cat("TRIAL\nTRIAL\nblah\nVARIABLE,X1,X2\nA,1,2\n", file="myfile1.csv")
cat("blah\nVARIABLE\nTRIAL,A1,A2\nA,1,2\n", file="myfile2.csv")
cat("blah\nblah\nVARIABLE\nTRIAL,Z1,Z2\nA,1,2\n", file="myfile3.csv")

flist<-list.files(pattern = "myfile.*.csv")

[1] "myfile1.csv" "myfile2.csv" "myfile3.csv"

我使用fread!grep 读取这些文件,其中包含一些字符串“TRIAL”

result <- lapply(flist,function(x)fread(paste("grep -v TRIAL",x),header = FALSE)[,FNAME:=x])

那么如果我尝试像这样写这些文件"myfile1_new.csv" "myfile2_new.csv" "myfile3_new.csv" ;

lapply(result,function(x) write.table(x,file = gsub("(.*)(\\..*)", "\\1_new\\2", flist),row.names = FALSE,col.names = TRUE))

文件中的错误(文件,ifelse(追加,“a”,“w”)):无效 'description' 参数另外:警告消息:在 if (file == "") file 1 并且只使用第一个元素

我知道result 是一个列表

str(result) List of 3,但我收到了类似上面的错误。

此外,我如何在同一 lapply 循环内组合 freadwrite.table

问候

【问题讨论】:

  • result 的内容是什么?它可能是一个列表,但它是您期望的对象列表(即可写)吗?
  • @steveb 请重现该示例。您将看到结果的内部。
  • gsub("(.*)(\\..*)", "\\1_new\\2", flist) 当 write.table 需要单个字符时是长度为 3 的向量矢量...也许 lapply(1:length(result), function(n) write.table(result[[n]], file = gsub("(.*)(\\..*)", "\\ 1_new\\2", flist)[n],row.names = FALSE,col.names = TRUE))
  • @chinsoon12 你不希望flist 也被n 索引(即flist[n])吗?
  • @Alexander 我在你的帖子中遗漏了一些东西,我能够重现这个问题。

标签: r data.table lapply fread


【解决方案1】:

第一部分:

gsub("(.*)(\\..*)", "\\1_new\\2", flist) 返回一个列表,因此您需要将其中的一个元素传递给write.table,我将通过在lapply() 函数中使用seq_along() 来实现,如下所示:

cat("TRIAL\nTRIAL\nblah\nVARIABLE,X1,X2\nA,1,2\n", file = "myfile1.csv")
cat("blah\nVARIABLE\nTRIAL,A1,A2\nA,1,2\n", file = "myfile2.csv")
cat("blah\nblah\nVARIABLE\nTRIAL,Z1,Z2\nA,1,2\n", file = "myfile3.csv")

flist <- list.files(pattern = "myfile.*.csv")

result <-
  lapply(flist, function(x)
    fread(x, header = FALSE)[, FNAME := x])

# str(gsub("(.*)(\\..*)", "\\1_new\\2", flist))  # returns a list

lapply(seq_along(result), function(i) {
  # print(gsub("(.*)(\\..*)", "\\1_new\\2", flist))  # a list
  # print(gsub("(.*)(\\..*)", "\\1_new\\2", flist)[i])  # this is what you want
  write.table(
    result[i],
    file = gsub("(.*)(\\..*)", "\\1_new\\2", flist[i]),
    row.names = FALSE,
    col.names = TRUE
  )
})

第二部分(合并为一个lapply())可能会涉及来自dplyr 包的管道(%&gt;%)运算符。

编辑:第二部分:

library(dplyr)

lapply(
  seq_along(flist),
  FUN = function(i) {
    # fread(paste("grep -v TRIAL", x), header = FALSE)[, FNAME := x])
    fread(flist[i], header = FALSE)[, FNAME := flist[i]] %>%
      write.table(
        file = gsub("(.*)(\\..*)", "\\1_new\\2", flist[i]),
        row.names = FALSE,
        col.names = TRUE
      )
  }
)

或者您可以将fread() 的结果分配给临时变量,然后执行write.table(temp, file = ...)

【讨论】:

    【解决方案2】:
    for (filename in flist) {
      d = fread(paste("grep -v TRIAL", filename), header = FALSE)[, FNAME := filename]
      write.table(d, gsub("(.*)(\\..*)", "\\1_new\\2", filename),
                  row.names = FALSE, col.names = TRUE)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2018-05-06
      • 2015-10-23
      • 2021-08-26
      相关资源
      最近更新 更多