在 R 中查找具有 NA 单元格的 .csv 文件的列平均值时出错

Errors in finding column mean of .csv file with NA cells in R

我有一个包含多个 .csv 文件的文件夹,其中包含多行和 39 列的原始数据(39 个变量的 x obs),这些文件已按如下方式读入 R:

# Name path containing .csv files as folder 
folder = ("/users/.../");

# Find the number of files in the folder
file_list = list.files(path=folder, pattern="*.csv")

# Read files in the folder
for (i in 1:length(file_list))
  {
  assign(file_list[i], 
         read.csv(paste(folder, file_list[i], sep='')))
}

我想在每个 .csv 文件中找到特定列的平均值,并将其保存在向量中,如下所示:

for (i in 1:length(file_list))
{
  clean = na.omit(file_list[i])
  ColumnNameMean[i] = mean(clean["ColumnName"])
}

当我 运行 上述代码片段时,出现错误“参数不是数字或逻辑:返回 NA”。尽管尝试使用 na.omit 删除 NA 值,但仍会发生这种情况。使用 complete.cases、

clean = file_list[i][complete.cases(file_list[i]), ]

我收到错误:维数不正确,即使列数没有明确说明。

我该如何解决这个问题?

编辑:将 clean[i] 更正为 clean(反之亦然)。 运行 代码,同样的错误。

Sample .csv file

这样试试:

setwd("U:/Playground/StackO/")


# Find the number of files in the folder
file_list = list.files(path=getwd(), pattern="*.csv")

# Read files in the folder
for (i in 1:length(file_list)){
  assign(file_list[i], 
         read.csv(file_list[i]))
}

ColumnNameMean <-  rep(NULL, length(file_list))

for (i in 1:length(file_list)){
  clean = get(file_list[i])
  ColumnNameMean[i] = mean(clean[,"Delta_TP10"])
}

ColumnNameMean
#> [1] 1.286201

我使用 get 检索 data.frame 否则 file_list[i] 只是 returns 一个字符串。我认为这是在 python 等其他语言中使用的成语。我试图忠实于您使用的方式,但有比这样的索引更简单的方法。

也许是这样:

lapply(list.files(path=getwd(), pattern="*.csv"), function(f){ dt <- read.csv(f); mean(dt[,"Delta_TP10"]) })

PS:小心 na.omit(),它会删除带有 NA 的所有行,在您的情况下是整个 data.frame,因为 Elements 是只有 NA

您的代码有几处错误。

  • folder = ("/users/.../"); 你不需要括号,你绝对不需要分号。 分号分隔指令,而不是结束它们。所以,这条指令实际上是两条指令,将字符串赋值给 folder; 之间,换行符是 NULL 指令。
  • 您正在 for 循环中的全局环境中创建许多对象,其中您 assign return 值 read.csv。最好将文件读入 data.frames.
  • 列表
  • na.omit 可以删除 data.frames 中的所有行。并且没有必要使用它,因为 mean 有一个 na.rm 参数。
  • 您计算每个 data.frame 的每一列的平均值。虽然 data.frames 是在循环中处理的,但列不是,而且 R 有一个快速的 colMeans 函数。
  • 您将 [ 误认为 [[。正确的方法是 clean[, "ColumnName"]clean[["ColumnName"]].

现在是代码,已修改。我提出了几种计算列均值的替代方法。

首先,一次性读取所有文件。我在阅读它们之前设置工作目录并在之后重置。

folder <- "/users/.../"
file_list <- list.files(path = folder, pattern = "^muse.*\.csv$")
old_dir <- setwd(folder)
df_list <- lapply(file_list, read.csv)
setwd(old_dir)

现在计算三列的均值。

cols <- c("Delta_TP9", "Delta_AF7", "Theta_TP9")
All_Means <- lapply(df_list, function(DF) colMeans(DF[cols], na.rm = TRUE))
names(All_Means) <- file_list

计算以 DeltaTheta 开头的所有列的均值。使用 grep 获取这些列名称。

df_names <- names(df_list[[1]])
cols2 <- grep("^Delta", df_names, value = TRUE)
cols2 <- c(cols2, grep("^Theta", df_names, value = TRUE))

All_Means_2 <- lapply(df_list, function(DF) colMeans(DF[cols2], na.rm = TRUE))
names(All_Means_2) <- file_list

最后,计算所有数字列的均值。请注意,这次索引向量 cols3 是一个逻辑向量。

cols3 <- sapply(df_list[[1]], is.numeric)
All_Means_3 <- lapply(df_list, function(DF) colMeans(DF[cols3], na.rm = TRUE))
names(All_Means_3) <- file_list