Chad Danyluck
2015-Jun-08 21:48 UTC
[R] Looping Through List of .csv Files to Work with Subsets of the Data
Hello, I want to subset specific rows of data from 80 .csv files and write those subsets into new .csv files. The data I want to subset starts on a different row for each original .csv file. I've created variables that identify which row the subset should start and end on, but I want to loop through this process and I am not sure what to do. I've attempted to write the loop below, albeit, much of it is pseudo code. If anyone can provide me with some tips I'd appreciate it. #### This data file is used to create the variables where the subsetting starts and ends for each participant #### mig.data <- read.csv("/Users/cdanyluck/Documents/Studies/MIG - Dissertation/Data & Syntax/mig.data.csv") # These are the variable names for the start and end of each subset of relevant data (baseline, audio, and free) participant.ids <- mig.processed.data$participant.id participant.baseline.start <- mig.processed.data$baseline.row.start participant.baseline.end <- mig.processed.data$baseline.row.end participant.audio.start <- mig.processed.data$audio.meditation.row.start participant.audio.end <- mig.processed.data$audio.meditation.row.end participant.free.start <- mig.processed.data$free.meditation.row.start participant.free.end <- mig.processed.data$free.meditation.row.end # read into a list the individual files from which to subset the data participant.files <- list.files("/Users/cdanyluck/Documents/Studies/MIG - Dissertation/Data & Syntax/MIG_RAW DATA & TXT Files/Plain Text Files") # loop through each participant for (i in 1:length(participant.files)) { # get baseline rows results.baseline <- participant.files[participant.baseline.start[i]:participant.baseline.end[i],] # get audio rows results.audio <- participant.files[participant.audio.start[i]:participant.audio.end[i],] # get free rows results.free <- participant.files[participant.free.start[i]:participant.free.end[i],] # write out participant relevant data write.csv(results.baseline, file="baseline[i].csv") write.csv(results.audio, file = "audio[i].csv") write.csv(results.free, file = "free[i].csv") } -- Chad M. Danyluck, MA PhD Candidate, Psychology University of Toronto ?There is nothing either good or bad but thinking makes it so.? - William Shakespeare [[alternative HTML version deleted]]
MacQueen, Don
2015-Jun-09 00:07 UTC
[R] Looping Through List of .csv Files to Work with Subsets of the Data
So you have 80 files, one for each participant? It appears that from each of the 80 files you want to extract three subsets of rows, one set for baseline one set for audio one set for "free" What I think I would do, if the above is correct, is create one "master" file. This file will have eight columns: (I'll show an example column name, followed by a description) id participant id fn file name for that participant srb start row for baseline erb end row for baseline sra start row for audio era end row for audio srf start row for free erf end row for free This may be fairly close to what you already have, but I'm not sure. I would then load the master file into R mstf <- read.csv( {the master file} ) Then loop through its rows, and since each row has all the information necessary to read the participant's individual file and identify which rows to subset, a loop like this should work. for (irow in seq(nrow(mstf$id))) { id <- mstf$id[irow] ## if id is numeric, e.g., 1, 2, 3 ... 80 then I would do this ## to ensure that the files sort properly when viewed by the operating system idc <- formatC(id, width=2, flag='0') crnt.file <- read.csv( mstf$fn[irow] ) ## base tmp.base <- crnt.file[ mstf$srb[irow]:mstf$erb[irow] , ] write.csv(tmp.base, file=paste0('baseline',idc,'.csv') ## audio tmp.audio <- crnt.file[ mstf$sra[irow]:mstf$era[irow] , ] write.csv(tmp.audio, file=paste0('audio',idc,'.csv') ## free tmp.free <- crnt.file[ mstf$srf[irow]:mstf$erf[irow] , ] write.csv(tmp.free, file=paste0('free',idc,'.csv') } Obviously, I can't test this. And there may be (likely are!) some typos in it. Note that it's not necessary to create variables that identify which row the subset should start and end on; these are just looked up from the master file when needed. Similarly, the three respective subsets are stored in temporary data frames, because they are not (I presume) needed when the whole thing is done. (if they were needed, then a different strategy would be more appropriate) There are different ways to index the loop. I just picked one. -- Don MacQueen Lawrence Livermore National Laboratory 7000 East Ave., L-627 Livermore, CA 94550 925-423-1062 On 6/8/15, 2:48 PM, "Chad Danyluck" <c.danyluck at gmail.com> wrote:>Hello, > >I want to subset specific rows of data from 80 .csv files and write those >subsets into new .csv files. The data I want to subset starts on a >different row for each original .csv file. I've created variables that >identify which row the subset should start and end on, but I want to loop >through this process and I am not sure what to do. I've attempted to write >the loop below, albeit, much of it is pseudo code. If anyone can provide >me >with some tips I'd appreciate it. > >#### This data file is used to create the variables where the subsetting >starts and ends for each participant #### >mig.data <- read.csv("/Users/cdanyluck/Documents/Studies/MIG - >Dissertation/Data & Syntax/mig.data.csv") > ># These are the variable names for the start and end of each subset of >relevant data (baseline, audio, and free) >participant.ids <- mig.processed.data$participant.id >participant.baseline.start <- mig.processed.data$baseline.row.start >participant.baseline.end <- mig.processed.data$baseline.row.end >participant.audio.start <- mig.processed.data$audio.meditation.row.start >participant.audio.end <- mig.processed.data$audio.meditation.row.end >participant.free.start <- mig.processed.data$free.meditation.row.start >participant.free.end <- mig.processed.data$free.meditation.row.end > ># read into a list the individual files from which to subset the data >participant.files <- list.files("/Users/cdanyluck/Documents/Studies/MIG - >Dissertation/Data & Syntax/MIG_RAW DATA & TXT Files/Plain Text Files") > ># loop through each participant >for (i in 1:length(participant.files)) { > > # get baseline rows > results.baseline <- >participant.files[participant.baseline.start[i]:participant.baseline.end[i >],] > > # get audio rows > results.audio ><- participant.files[participant.audio.start[i]:participant.audio.end[i],] > > # get free rows > results.free <- >participant.files[participant.free.start[i]:participant.free.end[i],] > > # write out participant relevant data > write.csv(results.baseline, file="baseline[i].csv") > write.csv(results.audio, file = "audio[i].csv") > write.csv(results.free, file = "free[i].csv") > >} > >-- >Chad M. Danyluck, MA >PhD Candidate, Psychology >University of Toronto > > > >?There is nothing either good or bad but thinking makes it so.? - William >Shakespeare > > [[alternative HTML version deleted]] > >______________________________________________ >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide >http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.
Chad Danyluck
2015-Jun-09 02:15 UTC
[R] Looping Through List of .csv Files to Work with Subsets of the Data
Thank you Don. I've incorporated your suggestions which have helped me to understand how loops work better than previously. However, the loop gets stuck trying to read the current file: mig.processed.data <- read.csv("/Users/cdanyluck/Documents/Studies/MIG - Dissertation/Data & Syntax/mig.log.data.addition.csv") ## ASSUMPTION: Starting with augmented processedbook and correct free.meditation.end #### Read in all data files and Loop through to create new data files segmented by the rows identified before #### # get required data participant.ids <- mig.processed.data$participant.id participant.baseline.start <- mig.processed.data$baseline.row.start participant.baseline.end <- mig.processed.data$baseline.row.end participant.audio.start <- mig.processed.data$audio.meditation.row.start participant.audio.end <- mig.processed.data$audio.meditation.row.end participant.free.start <- mig.processed.data$free.meditation.row.start participant.free.end <- mig.processed.data$free.meditation.row.end participant.files <- list.files("/Users/cdanyluck/Documents/Studies/MIG - Dissertation/Data & Syntax/MIG_RAW DATA & TXT Files/Plain Text Files") for (i in 1:length(participant.files)) { id <- participant.files[i] ## if id is numeric, e.g., 1, 2, 3 ... 80 then I would do this ## to ensure that the files sort properly when viewed by the operating #system idc <- formatC(id, width=3, flag='0') #current file crnt.file[i] <- read.csv( participant.files[i] ) ## base tmp.base <- crnt.file[participant.baseline.start:participant.baseline.end, ] write.csv(tmp.base, file=paste0('baseline',idc,'.csv')) ## audio tmp.audio <- crnt.file[participant.audio.start:participant.audio.end, ] write.csv(tmp.audio, file=paste0('audio',idc,'.csv')) ## free tmp.free <- crnt.file[participant.free.start:participant.free.end, ] write.csv(tmp.free, file=paste0('free',idc,'.csv')) } The error message reads: Error in file(file, "rt") : cannot open the connection In addition: Warning message: In file(file, "rt") : cannot open file '103.csv': No such file or directory So it seems to be calling the first file in the list but getting stuck. Any suggestions? Best, Chad On Mon, Jun 8, 2015 at 8:07 PM, MacQueen, Don <macqueen1 at llnl.gov> wrote:> So you have 80 files, one for each participant? > > It appears that from each of the 80 files you want to extract three > subsets of rows, > one set for baseline > one set for audio > one set for "free" > > What I think I would do, if the above is correct, is create one "master" > file. This file will have eight columns: > (I'll show an example column name, followed by a description) > id participant id > fn file name for that participant > srb start row for baseline > erb end row for baseline > sra start row for audio > era end row for audio > srf start row for free > erf end row for free > > This may be fairly close to what you already have, but I'm not sure. > > I would then load the master file into R > mstf <- read.csv( {the master file} ) > > Then loop through its rows, and since each row has all the information > necessary to read the participant's individual file and identify which > rows to subset, a loop like this should work. > > for (irow in seq(nrow(mstf$id))) { > > id <- mstf$id[irow] > ## if id is numeric, e.g., 1, 2, 3 ... 80 then I would do this > ## to ensure that the files sort properly when viewed by the operating > system > idc <- formatC(id, width=2, flag='0') > > crnt.file <- read.csv( mstf$fn[irow] ) > > ## base > tmp.base <- crnt.file[ mstf$srb[irow]:mstf$erb[irow] , ] > write.csv(tmp.base, file=paste0('baseline',idc,'.csv') > > > ## audio > tmp.audio <- crnt.file[ mstf$sra[irow]:mstf$era[irow] , ] > write.csv(tmp.audio, file=paste0('audio',idc,'.csv') > > > > ## free > tmp.free <- crnt.file[ mstf$srf[irow]:mstf$erf[irow] , ] > write.csv(tmp.free, file=paste0('free',idc,'.csv') > > } > > > Obviously, I can't test this. And there may be (likely are!) some typos in > it. > > Note that it's not necessary to create variables that identify which row > the subset should start and end on; these are just looked up from the > master file when needed. Similarly, the three respective subsets are > stored in temporary data frames, because they are not (I presume) needed > when the whole thing is done. (if they were needed, then a different > strategy would be more appropriate) > > There are different ways to index the loop. I just picked one. > > -- > Don MacQueen > > Lawrence Livermore National Laboratory > 7000 East Ave., L-627 > Livermore, CA 94550 > 925-423-1062 > > > > > > On 6/8/15, 2:48 PM, "Chad Danyluck" <c.danyluck at gmail.com> wrote: > > >Hello, > > > >I want to subset specific rows of data from 80 .csv files and write those > >subsets into new .csv files. The data I want to subset starts on a > >different row for each original .csv file. I've created variables that > >identify which row the subset should start and end on, but I want to loop > >through this process and I am not sure what to do. I've attempted to write > >the loop below, albeit, much of it is pseudo code. If anyone can provide > >me > >with some tips I'd appreciate it. > > > >#### This data file is used to create the variables where the subsetting > >starts and ends for each participant #### > >mig.data <- read.csv("/Users/cdanyluck/Documents/Studies/MIG - > >Dissertation/Data & Syntax/mig.data.csv") > > > ># These are the variable names for the start and end of each subset of > >relevant data (baseline, audio, and free) > >participant.ids <- mig.processed.data$participant.id > >participant.baseline.start <- mig.processed.data$baseline.row.start > >participant.baseline.end <- mig.processed.data$baseline.row.end > >participant.audio.start <- mig.processed.data$audio.meditation.row.start > >participant.audio.end <- mig.processed.data$audio.meditation.row.end > >participant.free.start <- mig.processed.data$free.meditation.row.start > >participant.free.end <- mig.processed.data$free.meditation.row.end > > > ># read into a list the individual files from which to subset the data > >participant.files <- list.files("/Users/cdanyluck/Documents/Studies/MIG - > >Dissertation/Data & Syntax/MIG_RAW DATA & TXT Files/Plain Text Files") > > > ># loop through each participant > >for (i in 1:length(participant.files)) { > > > > # get baseline rows > > results.baseline <- > >participant.files[participant.baseline.start[i]:participant.baseline.end[i > >],] > > > > # get audio rows > > results.audio > ><- participant.files[participant.audio.start[i]:participant.audio.end[i],] > > > > # get free rows > > results.free <- > >participant.files[participant.free.start[i]:participant.free.end[i],] > > > > # write out participant relevant data > > write.csv(results.baseline, file="baseline[i].csv") > > write.csv(results.audio, file = "audio[i].csv") > > write.csv(results.free, file = "free[i].csv") > > > >} > > > >-- > >Chad M. Danyluck, MA > >PhD Candidate, Psychology > >University of Toronto > > > > > > > >?There is nothing either good or bad but thinking makes it so.? - William > >Shakespeare > > > > [[alternative HTML version deleted]] > > > >______________________________________________ > >R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > >https://stat.ethz.ch/mailman/listinfo/r-help > >PLEASE do read the posting guide > >http://www.R-project.org/posting-guide.html > >and provide commented, minimal, self-contained, reproducible code. > >-- Chad M. Danyluck, MA PhD Candidate, Psychology University of Toronto ?There is nothing either good or bad but thinking makes it so.? - William Shakespeare [[alternative HTML version deleted]]