Hi, I'm struggling to figure out the way to change the name of a column from within a loop. The problem is I can't refer to the object by its actual variable name, since that will change each time through the loop. My xts object is A.> head(A)A.Open A.High A.Low A.Close A.Volume A.Adjusted A.Adjusted.1 2007-01-03 34.99 35.48 34.05 34.30 2574600 34.30 11867800000 2007-01-04 34.30 34.60 33.46 34.41 2073700 34.41 11905860000 2007-01-05 34.30 34.40 34.00 34.09 2676600 34.09 11795140000 2007-01-08 33.98 34.08 33.68 33.97 1557200 33.97 11753620000 2007-01-09 34.08 34.32 33.63 34.01 1386200 34.01 11767460000 2007-01-10 34.04 34.04 33.37 33.70 2157400 33.70 11660200000 It's column names are:> colnames(A)[1] "A.Open" "A.High" "A.Low" "A.Close" "A.Volume" "A.Adjusted" "A.Adjusted.1" I want to change the 7th column name:> colnames(A)[7][1] "A.Adjusted.1" I need to do that through a reference to i:> i[1] "A" This works:> colnames(get(i))[7][1] "A.Adjusted.1" And this is what I want to change the column name to:> paste(i, ".MarketCap", sep = "")[1] "A.MarketCap" But how do I make the assignment? This clearly doesn't work:> colnames(get(i))[7] <- paste(i, ".MarketCap", sep = "")Error in colnames(get(i))[7] <- paste(i, ".MarketCap", sep = "") : could not find function "get<-" Nor does this (it creates a new object "A.Adjusted.1" with a value of "A.MarketCap") : assign(colnames(get(i))[7], paste(i, ".MarketCap", sep = "")) How can I change the name of that column within my big loop? Any ideas? Thanks! Best regards, James
David Winsemius
2011-Mar-17 01:20 UTC
[R] Need to abstract changing name of column within loop
On Mar 16, 2011, at 7:58 PM, jctoll wrote:> Hi, > > I'm struggling to figure out the way to change the name of a column > from within a loop. The problem is I can't refer to the object by its > actual variable name, since that will change each time through the > loop. My xts object is A. > >> head(A) > A.Open A.High A.Low A.Close A.Volume A.Adjusted A.Adjusted.1 > 2007-01-03 34.99 35.48 34.05 34.30 2574600 34.30 > 11867800000 > 2007-01-04 34.30 34.60 33.46 34.41 2073700 34.41 > 11905860000 > 2007-01-05 34.30 34.40 34.00 34.09 2676600 34.09 > 11795140000 > 2007-01-08 33.98 34.08 33.68 33.97 1557200 33.97 > 11753620000 > 2007-01-09 34.08 34.32 33.63 34.01 1386200 34.01 > 11767460000 > 2007-01-10 34.04 34.04 33.37 33.70 2157400 33.70 > 11660200000 > > It's column names are: >> colnames(A) > [1] "A.Open" "A.High" "A.Low" "A.Close" > "A.Volume" "A.Adjusted" "A.Adjusted.1" > > I want to change the 7th column name: >> colnames(A)[7] > [1] "A.Adjusted.1" > > I need to do that through a reference to i: >> i > [1] "A" >It's not pretty and there may be a more direct way: > a [,1] [,2] [1,] 1e+20 1000 [2,] 1e+02 1000 > b <- "a" > assign("tmp", eval(parse(text=b))) > tmp [,1] [,2] [1,] 1e+20 1000 [2,] 1e+02 1000 > colnames(tmp) <- c("one","two") > assign( b, tmp) > a one two [1,] 1e+20 1000 [2,] 1e+02 1000 Trying to short circuit the process without an intermediate temporary structure fails: > colnames(eval(parse(text=b)) )<- c("two", "three") Error in parse(`*tmp*`) : EOF whilst reading MBCS char at line 1 -- David> This works: >> colnames(get(i))[7] > [1] "A.Adjusted.1" > > And this is what I want to change the column name to: >> paste(i, ".MarketCap", sep = "") > [1] "A.MarketCap" > > But how do I make the assignment? This clearly doesn't work: > >> colnames(get(i))[7] <- paste(i, ".MarketCap", sep = "") > Error in colnames(get(i))[7] <- paste(i, ".MarketCap", sep = "") : > could not find function "get<-" > > Nor does this (it creates a new object "A.Adjusted.1" with a value of > "A.MarketCap") : > > assign(colnames(get(i))[7], paste(i, ".MarketCap", sep = "")) > > How can I change the name of that column within my big loop? Any > ideas? Thanks! > > Best regards, > > > James > > ______________________________________________ > R-help at r-project.org mailing list > 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.David Winsemius, MD West Hartford, CT
Joshua Ulrich
2011-Mar-17 15:32 UTC
[R] Need to abstract changing name of column within loop
On Wed, Mar 16, 2011 at 6:58 PM, jctoll <jctoll at gmail.com> wrote:> Hi, > > I'm struggling to figure out the way to change the name of a column > from within a loop. ?The problem is I can't refer to the object by its > actual variable name, since that will change each time through the > loop. ?My xts object is A. > >> head(A) > ? ? ? ? ? A.Open A.High A.Low A.Close A.Volume A.Adjusted A.Adjusted.1 > 2007-01-03 ?34.99 ?35.48 34.05 ? 34.30 ?2574600 ? ? ?34.30 ?11867800000 > 2007-01-04 ?34.30 ?34.60 33.46 ? 34.41 ?2073700 ? ? ?34.41 ?11905860000 > 2007-01-05 ?34.30 ?34.40 34.00 ? 34.09 ?2676600 ? ? ?34.09 ?11795140000 > 2007-01-08 ?33.98 ?34.08 33.68 ? 33.97 ?1557200 ? ? ?33.97 ?11753620000 > 2007-01-09 ?34.08 ?34.32 33.63 ? 34.01 ?1386200 ? ? ?34.01 ?11767460000 > 2007-01-10 ?34.04 ?34.04 33.37 ? 33.70 ?2157400 ? ? ?33.70 ?11660200000 > > It's column names are: >> colnames(A) > [1] "A.Open" ? ? ? "A.High" ? ? ? "A.Low" ? ? ? ?"A.Close" > "A.Volume" ? ? "A.Adjusted" ? "A.Adjusted.1" > > I want to change the 7th column name: >> colnames(A)[7] > [1] "A.Adjusted.1" > > I need to do that through a reference to i: >> i > [1] "A" > > This works: >> colnames(get(i))[7] > [1] "A.Adjusted.1" > > And this is what I want to change the column name to: >> paste(i, ".MarketCap", sep = "") > [1] "A.MarketCap" > > But how do I make the assignment? ?This clearly doesn't work: > >> colnames(get(i))[7] <- ?paste(i, ".MarketCap", sep = "") > Error in colnames(get(i))[7] <- paste(i, ".MarketCap", sep = "") : > ?could not find function "get<-" > > Nor does this (it creates a new object "A.Adjusted.1" with a value of > "A.MarketCap") : > > assign(colnames(get(i))[7], paste(i, ".MarketCap", sep = "")) > > How can I change the name of that column within my big loop? ?Any > ideas? ?Thanks! >I usually make a copy of the object, change it, then overwrite the original: tmp <- get(i) colnames(tmp)[7] <- "foo" assign(i,tmp) Hope that helps.> Best regards, > > > James > > ______________________________________________ > R-help at r-project.org mailing list > 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. >-- Joshua Ulrich | FOSS Trading: www.fosstrading.com
Seemingly Similar Threads
- Relative subscripting
- read.csv fails in R console in Ubuntu terminal but works in RStudio after R 3.6.3 upgrade to R 4.0.2
- How to send Html using SQL Server db mail
- read.csv fails in R console in Ubuntu terminal but works in RStudio after R 3.6.3 upgrade to R 4.0.2
- read.csv fails in R console in Ubuntu terminal but works in RStudio after R 3.6.3 upgrade to R 4.0.2