使用新名称在 fread 后写入文件

Writing files after fread with a new name

假设我有这样的文件,

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))

Error in file(file, ifelse(append, "a", "w")) : invalid 'description' argument In addition: Warning message: In if (file == "") file <- stdout() else if (is.character(file)) { : the condition has length > 1 and only the first element will be used

我知道result是一个列表

str(result) 列表 3,但我收到如上所示的错误。

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

问候

第一部分:

gsub("(.*)(\..*)", "\1_new\2", flist) returns 一个列表,所以你需要将它的一个元素传递给 write.table,我会在 [=15] 中使用 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 包的管道 (%>%) 运算符。

编辑:第二部分:

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 = ...).

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)
}