最近,我需要编写可复制的R代码,用于读取一批.csv文件,然后以相同的名称输出每个文件。例如,
filenames <- list.files(path="G:\\test")
filenames
[1] "mydata1.csv" "mydata2.csv" "mydata3.csv"........."mydata100.csv"
length(filenames)
100对于这100个文件,我需要读取文件,重新格式化,然后使用sink()输出同名的.txt文件。(感谢弗兰克帮了我很多代码!)例如,我在文件夹"G:\test“下读取第一个.csv文件mydata1,并希望使用折叠代码输出同名为mydata1的.txt文件。
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文件?
发布于 2015-05-16 09:18:25
这是相当简单的。正如Alex .提到的,您可以获得带有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()
}https://stackoverflow.com/questions/30267620
复制相似问题