R 用于将代码应用于不同文件的循环
我希望你们都做得很好。我是初学者 我有这段代码来获取excel文件的行数和列的平均值R 用于将代码应用于不同文件的循环,r,loops,R,Loops,我希望你们都做得很好。我是初学者 我有这段代码来获取excel文件的行数和列的平均值 data <- read.table("filename.xls",sep = "\t", header = T) mean <- mean(data$Perim.) ncells <- nrow(data) df <- data.frame (mean,ncells) write.table(df, file = "data.c
data <- read.table("filename.xls",sep = "\t", header = T)
mean <- mean(data$Perim.)
ncells <- nrow(data)
df <- data.frame (mean,ncells)
write.table(df, file = "data.csv")`
我得到以下错误:
Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
cannot open file 'file.list[i]': No such file or directory
有人能解释一下这个错误并帮助构建循环的其余部分吗?非常感谢。您的
文件。列表是一个向量,而不是列表。因此,您应该使用单括号引用它的元素:file.list[i]
然后创建一个列表项来存储结果是很有帮助的。
请注意,在存储新列表元素时,列表项mylist
上使用了双括号
mylist <- list()
for(i in 1:length(file.list)){
mydata <- read.table("file.list[i]",sep = "\t", header = T)
mean <- mean(mydata$Perim.)
ncells <- nrow(mydata)
mydata2 <- data.frame(Col1Label = mean, Col2Label = ncells)
mylist[[i]] <- mydata2
}
names(mylist) <- file.list
或
如果需要,可以使用data.table包中的rbindlist()
折叠成data.table。这是非常高效的,如果您首先通过知道要解析多少文件来指定列表的大小,则效率更高
您还可以执行以下操作,首先创建一个数据帧,然后在每次迭代中使用循环将一行绑定到数据帧。就性能而言,这远远不是最优的,但是如果您只有100或1000个文件要读取,那么就可以了
mydataframe <- data.frame()
for(i in 1:length(file.list)){
mydata <- read.table("file.list[i]",sep = "\t", header = T)
mean <- mean(mydata$Perim.)
ncells <- nrow(mydata)
mydataset <- file.list[i]
mydata2 <- data.frame(Col1Label = mean, Col2Label = ncells, Dataset = mydataset)
mydataframe <- rbind(mydataframe,mydata2)
}
mydataframe您的文件。list
是一个向量,而不是列表。因此,您应该使用单括号引用它的元素:file.list[i]
然后创建一个列表项来存储结果是很有帮助的。
请注意,在存储新列表元素时,列表项mylist
上使用了双括号
mylist <- list()
for(i in 1:length(file.list)){
mydata <- read.table("file.list[i]",sep = "\t", header = T)
mean <- mean(mydata$Perim.)
ncells <- nrow(mydata)
mydata2 <- data.frame(Col1Label = mean, Col2Label = ncells)
mylist[[i]] <- mydata2
}
names(mylist) <- file.list
或
如果需要,可以使用data.table包中的rbindlist()
折叠成data.table。这是非常高效的,如果您首先通过知道要解析多少文件来指定列表的大小,则效率更高
您还可以执行以下操作,首先创建一个数据帧,然后在每次迭代中使用循环将一行绑定到数据帧。就性能而言,这远远不是最优的,但是如果您只有100或1000个文件要读取,那么就可以了
mydataframe <- data.frame()
for(i in 1:length(file.list)){
mydata <- read.table("file.list[i]",sep = "\t", header = T)
mean <- mean(mydata$Perim.)
ncells <- nrow(mydata)
mydataset <- file.list[i]
mydata2 <- data.frame(Col1Label = mean, Col2Label = ncells, Dataset = mydataset)
mydataframe <- rbind(mydataframe,mydata2)
}
mydataframe了解apply
或map
。此处不需要循环:
x <- lapply(list.files(pattern='*.txt'), function(x) read.table(x ,sep = "\t", header = T))
x <- purrr::map(list.files(pattern='*.txt'), ~ read.table(.x, sep = "\t", header = T))
purrr::map(seq_along(x), ~ mean(data$perim[[.x]]))
x了解apply
或map
。此处不需要循环:
x <- lapply(list.files(pattern='*.txt'), function(x) read.table(x ,sep = "\t", header = T))
x <- purrr::map(list.files(pattern='*.txt'), ~ read.table(.x, sep = "\t", header = T))
purrr::map(seq_along(x), ~ mean(data$perim[[.x]]))
x可能我表达错误,我得到了列表,但我不知道如何应用上面的代码:意思是可能我表达错误,我得到了列表,但我不知道如何应用上面的代码:意思是可能我表达错误,我得到了列表,但是我不知道如何应用上面的代码:这意味着我已经修改了我的注释。可能会有一些语法错误,因为您没有提供可重复使用的数据,但这应该可以帮助您克服困难。也许我表达错误,我得到了列表,但我不知道如何应用上面的代码:意思是我修改了我的注释。可能会有一些语法错误,因为您没有提供可重复使用的数据,但这会让您度过难关。
x <- lapply(list.files(pattern='*.txt'), function(x) read.table(x ,sep = "\t", header = T))
x <- purrr::map(list.files(pattern='*.txt'), ~ read.table(.x, sep = "\t", header = T))
purrr::map(seq_along(x), ~ mean(data$perim[[.x]]))