InfiniteFlash
InfiniteFlash

Reputation: 1058

Renaming datasets in environment

Here's what is in my environment. I have a bunch of csv files loaded as data frames ,named by some combination of Month/Year, in my environment.

enter image description here

What I would like to do is rename these objects, not the columns/rows, but the objects themselves.

For example, I am interested in removing the "FRL.csv", or last 7 characters of the character string that titles each of these data frames. Then I would get "APR03", "APR04", ..... , "JUL02", "JUL03".

What I've done.

Here's how to acquire the list of names that are the labels of the objects in my environment.

ls(all.names = TRUE, envir = .GlobalEnv)

[1] "APR01FRL.csv" "APR02FRL.csv" "APR03FRL.csv" "APR04FRL.csv" "APR05FRL.csv" "APR06FRL.csv" "APR07FRL.csv"
[8] "APR08FRL.csv" "APR09FRL.csv" "JAN01FRL.csv" "JAN02FRL.csv" "JAN03FRL.csv" "JAN04FRL.csv" "JAN05FRL.csv"
[15] "JAN06FRL.csv" "JAN07FRL.csv" "JAN08FRL.csv" "JAN09FRL.csv" "JAN10FRL.csv" "JUL01FRL.csv" "JUL02FRL.csv"
[22] "JUL03FRL.csv" "JUL04FRL.csv" "JUL05FRL.csv" "JUL06FRL.csv" "JUL07FRL.csv" "JUL08FRL.csv" "JUL09FRL.csv"
[29] "JUL10FRL.csv" "MAR10FRL.csv" "MAY10FRL.csv" "NOV09FRL.csv" "NOV10FRL.csv" "OCT01FRL.csv" "OCT02FRL.csv"
[36] "OCT03FRL.csv" "OCT04FRL.csv" "OCT05FRL.csv" "OCT06FRL.csv" "OCT07FRL.csv" "OCT08FRL.csv" "SEP09FRL.csv"
[43] "SEP10FRL.csv"



assign(
   ls(all.names = TRUE, envir = .GlobalEnv), 
   paste(
     substr(ls(all.names = TRUE, envir = .GlobalEnv), 1, 3), 
     substr(ls(all.names = TRUE, envir = .GlobalEnv), 4, 5), 
           sep = "-")
   )

Which is just me attempting to assign new strings to replace those in the global environment.

Inside the paste code are strings that I am inputting.

paste(
         substr(ls(all.names = TRUE, envir = .GlobalEnv), 1, 3), 
         substr(ls(all.names = TRUE, envir = .GlobalEnv), 4, 5), 
               sep = "-")

[1] "APR-01" "APR-02" "APR-03" "APR-04" "APR-05" "APR-06" "APR-07" "APR-08" "APR-09" "JAN-01" "JAN-02" "JAN-03"
[14] "JAN-04" "JAN-05" "JAN-06" "JAN-07" "JAN-08" "JAN-09" "JAN-10" "JUL-01" "JUL-02" "JUL-03" "JUL-04" "JUL-05" "JUL-06"
[27] "JUL-07" "JUL-08" "JUL-09" "JUL-10" "MAR-10" "MAY-10" "NOV-09" "NOV-10" "OCT-01" "OCT-02" "OCT-03" "OCT-04" "OCT-05"
[40] "OCT-06" "OCT-07" "OCT-08" "SEP-09" "SEP-10"

I get this error when I run the assign code.

Warning message: In assign(ls(all.names = TRUE, envir = .GlobalEnv), paste(substr(ls(all.names = TRUE, : only the first element is used as variable name

and none of the data sets in my environment are renamed.

enter image description here

Does anyone have suggestions on how to go about renaming objects in the environment pane, or the objects themselves?

Upvotes: 2

Views: 3282

Answers (2)

Adam Hoelscher
Adam Hoelscher

Reputation: 1892

A for loop with an assign and a rm in it can be used to do this. You may need to add a pattern argument to ls in order to avoid renaming object you don't want to rename.

APR01FRL.csv <- 1
JAN06FRL.csv <- 2
JUL03FRL.csv <- 3

(function(){
  for (old_name in ls(pos = .GlobalEnv)){
    new_name <- paste(
      substr(old_name, 1, 3), 
      substr(old_name, 4, 5), 
      sep = "-")
    assign(x = new_name, value = get(old_name, pos = .GlobalEnv), pos = .GlobalEnv)
    rm(list = old_name, pos = .GlobalEnv)
  }
})()

print(data.frame(name = ls(), value = get(ls())))

Upvotes: 2

bgoldst
bgoldst

Reputation: 35314

I would use a simple for-loop:

## create test objects (because I don't have your data.frames)
ns <- c('APR01FRL.csv','APR02FRL.csv','APR03FRL.csv','APR04FRL.csv','APR05FRL.csv','APR06FRL.csv','APR07FRL.csv','APR08FRL.csv','APR09FRL.csv','JAN01FRL.csv','JAN02FRL.csv','JAN03FRL.csv','JAN04FRL.csv','JAN05FRL.csv','JAN06FRL.csv','JAN07FRL.csv','JAN08FRL.csv','JAN09FRL.csv','JAN10FRL.csv','JUL01FRL.csv','JUL02FRL.csv','JUL03FRL.csv','JUL04FRL.csv','JUL05FRL.csv','JUL06FRL.csv','JUL07FRL.csv','JUL08FRL.csv','JUL09FRL.csv','JUL10FRL.csv','MAR10FRL.csv','MAY10FRL.csv','NOV09FRL.csv','NOV10FRL.csv','OCT01FRL.csv','OCT02FRL.csv','OCT03FRL.csv','OCT04FRL.csv','OCT05FRL.csv','OCT06FRL.csv','OCT07FRL.csv','OCT08FRL.csv','SEP09FRL.csv','SEP10FRL.csv');
for (n in ns) assign(n,data.frame());

## retrieve all target data.frames by name pattern
ns <- ls(all.names=T,envir=globalenv(),pattern='FRL\\.csv$');
ns;
## [1] "APR01FRL.csv" "APR02FRL.csv" "APR03FRL.csv" "APR04FRL.csv" "APR05FRL.csv" "APR06FRL.csv" "APR07FRL.csv" "APR08FRL.csv" "APR09FRL.csv" "JAN01FRL.csv" "JAN02FRL.csv" "JAN03FRL.csv" "JAN04FRL.csv" "JAN05FRL.csv" "JAN06FRL.csv" "JAN07FRL.csv" "JAN08FRL.csv" "JAN09FRL.csv" "JAN10FRL.csv" "JUL01FRL.csv" "JUL02FRL.csv" "JUL03FRL.csv" "JUL04FRL.csv" "JUL05FRL.csv" "JUL06FRL.csv" "JUL07FRL.csv" "JUL08FRL.csv" "JUL09FRL.csv" "JUL10FRL.csv" "MAR10FRL.csv" "MAY10FRL.csv" "NOV09FRL.csv" "NOV10FRL.csv" "OCT01FRL.csv" "OCT02FRL.csv" "OCT03FRL.csv" "OCT04FRL.csv" "OCT05FRL.csv" "OCT06FRL.csv" "OCT07FRL.csv" "OCT08FRL.csv" "SEP09FRL.csv" "SEP10FRL.csv"

## rename them with a for-loop
for (n in ns) { n2 <- sub('FRL\\.csv$','',n); assign(n2,get(n)); rm(list=n); };

## show the result
ls(all.names=T,envir=globalenv(),pattern='FRL\\.csv$');
## character(0)
ls(all.names=T,envir=globalenv(),pattern='^[A-Z]{3}[0-9]{2}$');
## [1] "APR01" "APR02" "APR03" "APR04" "APR05" "APR06" "APR07" "APR08" "APR09" "JAN01" "JAN02" "JAN03" "JAN04" "JAN05" "JAN06" "JAN07" "JAN08" "JAN09" "JAN10" "JUL01" "JUL02" "JUL03" "JUL04" "JUL05" "JUL06" "JUL07" "JUL08" "JUL09" "JUL10" "MAR10" "MAY10" "NOV09" "NOV10" "OCT01" "OCT02" "OCT03" "OCT04" "OCT05" "OCT06" "OCT07" "OCT08" "SEP09" "SEP10"

Upvotes: 4

Related Questions