在 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(反之亦然)。 运行 代码,同样的错误。
这样试试:
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[,"Delt
a_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
计算以 Delta
或 Theta
开头的所有列的均值。使用 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
我有一个包含多个 .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(反之亦然)。 运行 代码,同样的错误。
这样试试:
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[,"Delt
a_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
计算以 Delta
或 Theta
开头的所有列的均值。使用 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