R 用于将代码应用于不同文件的循环

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

我希望你们都做得很好。我是初学者

我有这段代码来获取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.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]]))