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

使用新名称在fread之后写入文件,r,data.table,lapply,fread,R,Data.table,Lapply,Fread,假设我有这样的文件 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 = "my

假设我有这样的文件

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"
然后,如果我尝试像这样编写这些文件,“myfile1\u new.csv”“myfile2\u new.csv”“myfile3\u new.csv”

文件(文件,ifelse(附加“a”、“w”))中出错:无效 “description”参数添加:警告消息:在if(文件)中== “”)文件1,并且仅使用第一个元素

我知道结果是一个列表

str(result)
3个列表,但我得到的错误如上所述

此外,如何将
fread
write.table
组合到同一
lappy
循环中

关于

第一部分:
gsub((.*)(\\..*),“\\1\u new\\2”,flist)
返回一个列表,因此您需要将其中的一个元素传递到
write.table
,我将通过在
lappy()
函数中使用
seq\u-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
  )
})
或者您可以将
fread()
的结果分配给一个临时变量,然后执行
write.table(temp,file=…)

第一部分:
gsub((.*)(\\..*),“\\1\u new\\2”,flist)
返回一个列表,因此您需要将其中的一个元素传递到
write.table
,我将通过在
lappy()
函数中使用
seq\u-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
  )
})

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

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