R,rbind 与变量定义的多个文件
R, rbind with multiple files defined by a variable
首先,这与 Coursera R 编程课程的作业问题有关。我找到了其他方法来做我想做的事,但我的研究让我想到了一个我很好奇的问题。我有可变数量的 csv 文件,我需要从中提取数据,然后取所述文件中 "pollutant" 列的平均值。这些文件在其目录中列出,并带有一个 ID 号。我将以下代码放在一起,这些代码适用于单个 csv 文件,但不适用于多个 csv 文件:
pollutantmean <- function (directory, pollutant, id = 1:332) {
id <- formatC(id, width=3, flag="0")`
dataset<-read.csv(paste(directory, "/", id,".csv",sep=""),header=TRUE)`
mean(dataset[,pollutant], na.rm = TRUE)`
}
如果我在创建函数时知道 id,我也知道如何 rbind
多个 csv 文件,但我不确定如何将 rbind
分配给可变范围的 id或者如果可能的话。我找到了其他方法来做到这一点,例如调用 lapply
和取消列出数据,只是好奇是否有更简单的方法。
好吧,这使用了 lapply,但它可能是您想要的。
file_list <- list.files("*your directory*", full.names = T)
combined_data <- do.call(rbind, lapply(file_list, read.csv, header = TRUE))
这会将您的所有文件变成一个大型数据集,从那里很容易取平均值。那是你想要的吗?
执行此操作的另一种方法是逐个文件逐步执行,计算总和和观察次数,然后再取平均值,如下所示:
sums <- numeric()
n <- numeric()
i <- 1
for(file in file_list){
temp_df <- read.csv(file, header = T)
temp_mean <- mean(temp_df$pollutant)
sums[i] <- sum(temp_df$pollutant)
n[i] <- nrow(temp_df)
i <- i + 1
}
new_mean <- sum(sums)/sum(n)
请注意,这两种方法都要求该文件夹中只有您需要的 csvs。如果您有其他您不感兴趣的文件,您可以在 list.files
调用中使用模式参数。
read.csv(文件,...)
中的 'file' 不接受向量
下面是你的一个小修改。创建了一个文件路径向量,它们被 sapply 循环。
files <- paste("directory-name/",formatC(1:332, width=3, flag="0"),
".csv",sep="")
pollutantmean <- function(file, pollutant) {
dataset <- read.csv(file, header = TRUE)
mean(dataset[, pollutant], na.rm = TRUE)
}
sapply(files, pollutantmean)
首先,这与 Coursera R 编程课程的作业问题有关。我找到了其他方法来做我想做的事,但我的研究让我想到了一个我很好奇的问题。我有可变数量的 csv 文件,我需要从中提取数据,然后取所述文件中 "pollutant" 列的平均值。这些文件在其目录中列出,并带有一个 ID 号。我将以下代码放在一起,这些代码适用于单个 csv 文件,但不适用于多个 csv 文件:
pollutantmean <- function (directory, pollutant, id = 1:332) {
id <- formatC(id, width=3, flag="0")`
dataset<-read.csv(paste(directory, "/", id,".csv",sep=""),header=TRUE)`
mean(dataset[,pollutant], na.rm = TRUE)`
}
如果我在创建函数时知道 id,我也知道如何 rbind
多个 csv 文件,但我不确定如何将 rbind
分配给可变范围的 id或者如果可能的话。我找到了其他方法来做到这一点,例如调用 lapply
和取消列出数据,只是好奇是否有更简单的方法。
好吧,这使用了 lapply,但它可能是您想要的。
file_list <- list.files("*your directory*", full.names = T)
combined_data <- do.call(rbind, lapply(file_list, read.csv, header = TRUE))
这会将您的所有文件变成一个大型数据集,从那里很容易取平均值。那是你想要的吗?
执行此操作的另一种方法是逐个文件逐步执行,计算总和和观察次数,然后再取平均值,如下所示:
sums <- numeric()
n <- numeric()
i <- 1
for(file in file_list){
temp_df <- read.csv(file, header = T)
temp_mean <- mean(temp_df$pollutant)
sums[i] <- sum(temp_df$pollutant)
n[i] <- nrow(temp_df)
i <- i + 1
}
new_mean <- sum(sums)/sum(n)
请注意,这两种方法都要求该文件夹中只有您需要的 csvs。如果您有其他您不感兴趣的文件,您可以在 list.files
调用中使用模式参数。
read.csv(文件,...)
中的 'file' 不接受向量下面是你的一个小修改。创建了一个文件路径向量,它们被 sapply 循环。
files <- paste("directory-name/",formatC(1:332, width=3, flag="0"),
".csv",sep="")
pollutantmean <- function(file, pollutant) {
dataset <- read.csv(file, header = TRUE)
mean(dataset[, pollutant], na.rm = TRUE)
}
sapply(files, pollutantmean)