我有一个包含数百csv
个文件的文件夹。我想使用lappply
来计算每个csv文件中一列的平均值,并将该值保存到一个新的csv文件中,该文件将包含两列:第1列将是原始文件的名称。第2列将是原始文件中所选字段的平均值。这是我到目前为止所做的:
setwd("C:/~~~~")
list.files()
filenames <- list.files()
read_csv <- lapply(filenames, read.csv, header = TRUE)
dataset <- lapply(filenames[1], mean)
write.csv(dataset, file = "Expected_Value.csv")
提供错误消息:
警告消息:在mean.default(“2pt.csv”[[1L]],...)中:参数不是数字或逻辑:返回NA
所以我认为我有两个(至少)问题是我无法弄清楚的。
首先,为什么不认识第1列是数字?我加倍,三重检查了csv文件,我确定这个列是数字的。
其次,如何让输出文件按照我上面描述的方式返回两列?我还没有完成第二部分。
我想先让第一部分工作。任何帮助表示赞赏。
答案 0 :(得分:1)
我没有使用lapply但是做了类似的事情。希望这有帮助!
i= 1:2 ##modify as per need
##create empty dataframe
df <- NULL
##list directory from where all files are to be read
directory <- ("C:/mydir/")
##read all file names from directory
x <- as.character(list.files(directory,,pattern='csv'))
xpath <- paste(directory, x, sep="")
##For loop to read each file and save metric and file name
for(i in i)
{
file <- read.csv(xpath[i], header=T, sep=",")
first_col <- file[,1]
d<-NULL
d$mean <- mean(first_col)
d$filename=x[i]
df <- rbind(df,d)
}
###write all output to csv
write.csv(df, file = "C:/mydir/final.csv")
CSV file looks like below
mean filename
1999.000661 hist_03082015.csv
1999.035121 hist_03092015.csv
答案 1 :(得分:0)
感谢您的两个答案。经过多次审查后发现,有一种更容易实现目标的方法。我拥有的csv
个文件最初位于一个文件中。我按位置将它们分成多个文件。当时,我认为有必要对每种类型计算mean
。显然,这是一个错误。我转到原始文件并使用aggregate
。代码:
setwd("C:/~~")
allshots <- read.csv("All_Shots.csv", header=TRUE)
EV <- aggregate(allshots$points, list(Location = allshots$Loc), mean)
write.csv(EV, file= "EV_location.csv")
这是一个简单的解决方案。再次感谢或回答。对于未来的项目,我需要在lapply
变得更好,这样他们就不会浪费时间。