最近我需要编写可重现的R代码来读取一批.csv文件,然后输出每个文件的相同名称。例如,
filenames <- list.files(path="G:\\test")
filenames
[1] "mydata1.csv" "mydata2.csv" "mydata3.csv"........."mydata100.csv"
length(filenames)
100
对于这100个文件中的每一个,我需要读取文件,重新格式化,然后使用sink()
以相同的名称输出.txt文件。 (感谢@Frank帮我解决了很多代码!)例如,我在第一个文件夹&#34; G:\ test&#34;中读取了第一个.csv文件mydata1
。我想使用以下代码输出一个名称相同的.txt文件:mydata1
。
mydata1
value group treatment
1 39.7 A 1
2 53.5 A 1
3 51.1 A 1
4 67.8 A 1
5 84.8 B 1
6 80.3 B 1
7 79.6 B 1
8 84.3 B 1
9 31.0 C 2
10 32.0 C 2
11 33.0 C 2
12 34.0 C 2
13 1.0 D 2
14 2.0 D 2
15 3.0 D 2
16 4.0 D 2
printables <- lapply(
split(mydata,mydata$treatment),
function(t)
split(t,as.character(t$group)))
sink("G:\\test\\mydata1.txt")
for (t in seq_along(printables)){
for(g in seq_along(printables[[t]])){
print(printables[[t]][[g]],row.names=FALSE)
cat('\n')
}
cat('\n\n')
}
sink()
因此,对于同一文件夹下的100个.csv文件,如何编写可重现的代码以自动捕获每个文件名,然后将捕获的名称放入sink()
以输出具有相同名称的txt文件?
答案 0 :(得分:1)
这非常简单。正如Alex A.所提到的,您可以使用grep(或者在本例中为sub)获取文件名的前缀,并在新文件名中使用它。
我做了一个更简单的工作示例。有两个csv文件,结构如下。读入这些,然后在循环中打印到接收输出。为了简单起见,我省略了你的代码,但假设它正在工作,它应该很容易替换。
file1.csv:
structure(list(file = c(1L, 1L), value = 1:2), .Names = c("file",
"value"), class = "data.frame", row.names = c(NA, -2L))
file2.csv:
structure(list(file = c(2L, 2L), value = 3:4), .Names = c("file",
"value"), class = "data.frame", row.names = c(NA, -2L))
R脚本:
setwd("path\\to\\files")
files <- list.files(pattern = "*.csv$")
files
for(i in 1:length(files)){
test.data <- read.csv(file = files[i], header = TRUE, stringsAsFactors = FALSE)
filenm <- sub("csv", "txt", files[i]) # get rid of csv suffix and replace with txt
print(filenm) #check, to make sure the above is working
sink(file = filenm, type = "output")
# your code here
print(head(test.data))
sink()
}