使用新名称在 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
循环中组合 fread
和 write.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)
}
假设我有这样的文件,
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
循环中组合 fread
和 write.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)
}