R:如何在多个csv中提取列,然后在一个文件夹中写入多个csv

时间:2020-05-18 09:03:02

标签: r loops csv

我有一个包含多个csv的文件夹(文件夹1):“ x.csv”,“ y.csv”,“ z.csv” ... 我想提取每个文件的第3列,然后在新文件夹(文件夹2)中写入新的csv文件。因此,文件夹2必须包含“ x.csv”,“ y.csv”,“ z.csv” ...(但仅包含第三列)。

我尝试过:

dfiles <- list.files(pattern =".csv") #if you want to read all the files in working directory
lst2 <- lapply(dfiles, function(x) (read.csv(x, header=FALSE)[,3]))

但是我得到了这个错误:

 Error in `[.data.frame`(read.csv(x, header = FALSE), , 3) : 
  undefined columns selected 

而且,我不知道如何编写多个csv。

但是,如果我只用一个文件执行此操作,即使输出位于同一文件夹中,它也可以正常工作

essai <-read.csv("x.csv", header = FALSE, sep = ",")[,3]
write.csv (essai, file = "x.csv")

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

所以这就是我要怎么做。也许有更好,更有效的方法,但它仍然应该可以很好地工作。

setwd("~/stackexchange") #set your main folder. Best way to do this is actually the here() package. But that's another topic.


library(tools) #for file extension tinkering
folder1 <- "folder1" #your original folder
folder2 <- "folder2" #your new folder

#I setup a function and loop over it with lapply.
write_to <- function(file.name){
file.name <-  paste0(tools::file_path_sans_ext(basename(file.name)), ".csv")
essai <-read.csv(paste(folder1, file.name, sep = "/"), header = FALSE, sep = ",")[,3]
write.csv(essai, file = paste(folder2, file.name, sep="/")) 
}


# get file names from folder 1
dfiles <- list.files(path=folder1, pattern ="*.csv") #if you want to read all the csv files in folder1 directory

lapply(X = paste(folder1, dfiles, sep="/"), write_to)

玩得开心! 顺便说一句:如果您有很多文件,则可以使用data.table::freaddata.table::fwrite来大大提高csv的读写速度。

答案 1 :(得分:0)

首先,从错误消息看来,某些csv文件的列数少于3。检查您是否正在读取正确的文件,以及是否所有文件至少应包含3列。

执行此操作后,可以使用下面的代码来读取csv文件,选择第3列并将csv文件写入root@raspberrypi3:~# gst-launch-1.0 -v souphttpsrc location=http://192.168.1.245:8080/video ! multipartdemux ! image/jpeg, framerate=25/1 ! jpegparse ! splitmuxsink location=file%02d.mkv max-size-time=10000000000 muxer=matroskamux Setting pipeline to PAUSED ... Pipeline is PREROLLING ... /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink: async = false Got context from element 'souphttpsrc0': gst.soup.session=context, session=(SoupSession)NULL, force=(boolean)false; /GstPipeline:pipeline0/GstCapsFilter:capsfilter1: caps = image/jpeg, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:src: caps = image/jpeg, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:sink: caps = image/jpeg, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstCapsFilter:capsfilter1.GstPad:sink: caps = image/jpeg /GstPipeline:pipeline0/GstJpegParse:jpegparse0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0.GstGhostPad:video.GstProxyPad:proxypad0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:sink: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0.GstPad:src: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = NULL /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstFileSink:sink: location = file00.mkv Pipeline is PREROLLED ... /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstMatroskaMux:matroskamux0.GstMatroskamuxPad:video_0: caps = image/jpeg, parsed=(boolean)true, format=(string)I420, width=(int)1280, height=(int)720, framerate=(fraction)25/1 Setting pipeline to PLAYING ... New clock: GstSystemClock /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 6 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 7 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 8 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 9 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 10 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 11 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 12 /GstPipeline:pipeline0/GstSplitMuxSink:splitmuxsink0/GstQueue:queue0: max-size-buffers = 13 [...]

'folder2'

答案 2 :(得分:0)

对于这个问题的“写”部分,我在purrr中使用map2()很幸运。我不确定这是否是最优雅的解决方案,但可以解决问题:

listofessais # this is your .csv files together as a named list of tbls
map2(listofessais, names(listofessais), ~write_csv(.x, glue("FilePath/{.y}.csv"))

这应该给您所有在该文件夹中导出的.csv文件,并使用与列表中相同的名称进行命名。

相关问题