我是R统计数据的新用户。我有一个巨大的for
循环,有多个大型文件,循环最终给我一个图形的结果。
除了输出文件名外,一切正常。 我想要做什么?
我正在使用
data1 <- read.csv("filepath/filename", header=TRUE, sep=",")
data2 <- read.csv("filepath/filename", header=TRUE, sep=",")
data3 <- read.csv("filepath/filename", header=TRUE, sep=",")
依此类推...阅读我的文件。
我希望输出图形文件名包含数据文件的名称和生成它的列。例如:
graph1-data1-data3-columnE.pdf
重要说明:我正在阅读的所有文件都具有完全相同的列名和编号。
我应该使用什么命令来执行此操作?
答案 0 :(得分:5)
您可以使用paste
解决此问题,因为@EDi指出了paste0
或sprintf
。我更喜欢后者,因为它具有非常干净的语法。在以下示例中,%i
(对于整数)替换为i
,d1
和d2
的值,%s
(对于字符串)替换为价值col
。
for(i in 1:n){
...
d1 <- 1 # Index of the first data file
d2 <- 3 # Index of the second data file
col <- "E" # Column name
...
outfile <- sprintf("Graph%i-data%i-data%i-column%s.pdf", i, d1, d2, col)
pdf(outfile)
...
dev.off()
}
每当您发现自己创建名为data1
,data2
,data3
等的对象时,您实际上是伪造了一个对象列表。改为使用正确的列表,您的语法将更紧凑,更易于阅读和写入。
# List all files named `data###.csv`, where ### is a number
my.files <- dir(".", "data[0-9]+\\.csv")
# Load all files in one go
my.data <- lapply(my.files, read.csv, header=TRUE, sep=",")
# Calculate the thing you are interested in
n <- length(my.files)
for(i in 1:n){
for(j in 1:n){
# Do stuff
pdf(sprintf("Graph-%i-%i.pdf", i, j))
plot(my.data[[i]], my.data[[j]])
dev.off()
}
}