在R中具有NA单元的.csv文件的列均值中查找错误

时间:2018-11-15 19:12:08

标签: r csv na

我有一个文件夹,其中包含几个.csv文件,这些文件包含具有多行和39列(x观察值的39个变量)的原始数据,这些数据已按以下方式读入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]以进行清洁(反之亦然)。 ran代码,同样的错误。

Sample .csv file

2 个答案:

答案 0 :(得分:0)

像这样尝试:

074
>>60

我使用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]等其他语言中使用的惯用法。我试图忠实于您的使用方式,但是比这样的索引索引更简单。

也许是这样:

python a_TP10“])})

PS:请注意lapply(list.files(path=getwd(), pattern="*.csv"), function(f){ dt <- read.csv(f); mean(dt[,"Delt,它会删除所有na.omit()的行,因为您NAdata.frame,因此Elements是您的整个NA

答案 1 :(得分:0)

您的代码有几处错误。

  • folder = ("/users/.../");您不需要括号,并且您绝对不需要分号。 用分号分隔说明,但不结束。因此,该指令实际上是两条指令,将字符串分配到folder以及;和换行符之间的NULL指令。
  • 您正在for循环的assign循环中的全局环境中创建许多对象,其中read.csv的返回值。最好将文件读入data.frames列表中。
  • na.omit可以从data.frames中删除所有行。由于mean有一个na.rm参数,因此不需要使用它。
  • 您可以计算每个data.frame每列的平均值。尽管data.frame是循环处理的,但列不是,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