我有一个文件夹,其中包含几个.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代码,同样的错误。
答案 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()
的行,因为您NA
仅data.frame
,因此Elements
是您的整个NA
答案 1 :(得分:0)
您的代码有几处错误。
folder = ("/users/.../");
您不需要括号,并且您绝对不需要分号。 用分号分隔说明,但不结束。因此,该指令实际上是两条指令,将字符串分配到folder
以及;
和换行符之间的NULL
指令。 for
循环的assign
循环中的全局环境中创建许多对象,其中read.csv
的返回值。最好将文件读入data.frames列表中。na.omit
可以从data.frames中删除所有行。由于mean
有一个na.rm
参数,因此不需要使用它。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