[R] Suggestions for vectorizing/double loop

Luanna Dixson justanotherdigression at gmail.com
Mon Jan 23 18:38:42 CET 2017

Hi all,

Thanks very much for your help! You are correct in thinking the list is the
same as before, actually, my question was more about how to do the next
steps, where I needed to match the filenames of the files in my directory
with old (i.e current) and new file name prefixes in my list. For each
match I then wanted to rename the original file using the corresponding new
filename prefix from the list.

Sorry for being a bit confusing, I didn't post my first attempt to do this
at first as my code just didn't work at all, but I have had another go
using a matrix instead and I think this does the job.


old_names <- list.files(old_path)

oldnames=c('1002', '1003')
newnames=c('1002_new', '1003_new')

for (i in old_names){
    temp <- unlist(strsplit(i, "[.]"))[1]
    n <- which(is.element(mapping,temp))
    if(length(n)>0) {
        #copy the file to the new folder
        #re name it and the name is paste(mapping[n,2], '.xls', sep="")
        print(paste(mapping[n,2], '.xls', sep=""))
        newnames <- paste(mapping[n,2], '.xls', sep="")
        file.copy(from = paste(old_path, i, sep=""),
                  to = paste(new_path, newnames))

On 23 January 2017 at 13:28, Luanna Dixson <justanotherdigression at gmail.com>

> I need to rename a bunch of files, by searching for string matches in a
> list. Each list element containings a character with the old filename that
> I want to match to, and the new file name that I want to rename by.
> For instance, here filename '1001.xls' should match to list[[1]]$oldname
> and I want to rename it to 'newa.xls' from list[[1]]$newname.
> The actual new file names I have will feature a random alphanumeric number
> and the list will have a length of ~600.
> # files I want to rename
> files with old file name =c('1001.xls', '1002.xls')
> # list with old file names and new file names
> oldnames=c('1001', '1002', '1003')
> newnames=c('newa', 'newb', 'newc')
> df=data.frame(oldnames,newnames)
> list <- split(df, rownames(df))
> # turn list elements in character
> for(i in 1:length(list)) list[[i]]$oldnames=as.
> character(list[[i]]$oldnames)
> for(i in 1:length(list)) list[[i]]$newnames=as.
> character(list[[i]]$newnames)
> I heard that it would be better to vectorize this than trying to do a
> double loop so if someone could give me a hint about how to do this I would
> be very grateful!

	[[alternative HTML version deleted]]

More information about the R-help mailing list