recode the same subset of variables in several list elements

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

recode the same subset of variables in several list elements

sjkiss
Hi there: I have a list of data frames with identical variable  names.  I’d like to reverse scale the same variables in each data.frame.  
I’d appreciate any one’s suggestions as to how to accomplish this. Right now, I’m working with the code at the very bottom of my sample data.
Thanks, Simon Kiss

#Create data.frame1
df<-data.frame(
  ivar1=sample(c(1,2,3), replace=TRUE, size=100),
  ivar2=sample(c(1,2,3), replace=TRUE, size=100),
  hvar1=sample(c(1,2,3), replace=TRUE, size=100),
  hvar2=sample(c(1,2,3), replace=TRUE, size=100),
  evar1=sample(c(1,2,3), replace=TRUE, size=100),
  evar2=sample(c(1,2,3), replace=TRUE, size=100)
  )
 
#data.frame2
  df1<-data.frame(
    ivar1=sample(c(1,2,3), replace=TRUE, size=100),
    ivar2=sample(c(1,2,3), replace=TRUE, size=100),
    hvar1=sample(c(1,2,3), replace=TRUE, size=100),
    hvar2=sample(c(1,2,3), replace=TRUE, size=100),
    evar1=sample(c(1,2,3), replace=TRUE, size=100),
    evar2=sample(c(1,2,3), replace=TRUE, size=100)
  )

#List
list1<-list(df, df1)
#vector of first variables I’d like to recode
i.recodes<-grep('^i.', names(df), value=TRUE)
#Vector of second variables to recode
e.recodes<-grep('^e.', names(df), value=TRUE)

#Set up RESCALE function from RPMG package
RESCALE <- function (x, nx1, nx2, minx, maxx)
{ nx = nx1 + (nx2 - nx1) * (x - minx)/(maxx - minx)
  return(nx)
}

#This is what I’m playing around with
test<-lapply(list1, function(y) {
  out<-y[,i.recodes]
  out<-lapply(out, function(x) RESCALE(x, 0,1,1,6))
  y[,names(x)]<-out
})
        [[alternative HTML version deleted]]

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: recode the same subset of variables in several list elements

Jim Lemon-4
Hi Simon,
How about this?

library(plotrix)
revlist<-grep("i",names(df),fixed=TRUE)
df[,revlist]<-sapply(df[,revlist],rescale,c(3,1))

Jim


On Fri, Apr 3, 2015 at 6:30 AM, Simon Kiss <[hidden email]> wrote:

> Hi there: I have a list of data frames with identical variable  names.
> I’d like to reverse scale the same variables in each data.frame.
> I’d appreciate any one’s suggestions as to how to accomplish this. Right
> now, I’m working with the code at the very bottom of my sample data.
> Thanks, Simon Kiss
>
> #Create data.frame1
> df<-data.frame(
>   ivar1=sample(c(1,2,3), replace=TRUE, size=100),
>   ivar2=sample(c(1,2,3), replace=TRUE, size=100),
>   hvar1=sample(c(1,2,3), replace=TRUE, size=100),
>   hvar2=sample(c(1,2,3), replace=TRUE, size=100),
>   evar1=sample(c(1,2,3), replace=TRUE, size=100),
>   evar2=sample(c(1,2,3), replace=TRUE, size=100)
>   )
>
> #data.frame2
>   df1<-data.frame(
>     ivar1=sample(c(1,2,3), replace=TRUE, size=100),
>     ivar2=sample(c(1,2,3), replace=TRUE, size=100),
>     hvar1=sample(c(1,2,3), replace=TRUE, size=100),
>     hvar2=sample(c(1,2,3), replace=TRUE, size=100),
>     evar1=sample(c(1,2,3), replace=TRUE, size=100),
>     evar2=sample(c(1,2,3), replace=TRUE, size=100)
>   )
>
> #List
> list1<-list(df, df1)
> #vector of first variables I’d like to recode
> i.recodes<-grep('^i.', names(df), value=TRUE)
> #Vector of second variables to recode
> e.recodes<-grep('^e.', names(df), value=TRUE)
>
> #Set up RESCALE function from RPMG package
> RESCALE <- function (x, nx1, nx2, minx, maxx)
> { nx = nx1 + (nx2 - nx1) * (x - minx)/(maxx - minx)
>   return(nx)
> }
>
> #This is what I’m playing around with
> test<-lapply(list1, function(y) {
>   out<-y[,i.recodes]
>   out<-lapply(out, function(x) RESCALE(x, 0,1,1,6))
>   y[,names(x)]<-out
> })
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] 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.

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: recode the same subset of variables in several list elements

sjkiss
Hi Jim, So that does the rescale part very efficiently. But I’d like to know how to do that on each list element using lapply or llply.  I have about 4 data frames and a few other recodes to do so automating would be nice, rather than applying your code to each individual list element.
simon

> On Apr 2, 2015, at 6:30 PM, Jim Lemon <[hidden email]> wrote:
>
> Hi Simon,
> How about this?
>
> library(plotrix)
> revlist<-grep("i",names(df),fixed=TRUE)
> df[,revlist]<-sapply(df[,revlist],rescale,c(3,1))
>
> Jim
>
>
> On Fri, Apr 3, 2015 at 6:30 AM, Simon Kiss <[hidden email] <mailto:[hidden email]>> wrote:
> Hi there: I have a list of data frames with identical variable  names.  I’d like to reverse scale the same variables in each data.frame.
> I’d appreciate any one’s suggestions as to how to accomplish this. Right now, I’m working with the code at the very bottom of my sample data.
> Thanks, Simon Kiss
>
> #Create data.frame1
> df<-data.frame(
>   ivar1=sample(c(1,2,3), replace=TRUE, size=100),
>   ivar2=sample(c(1,2,3), replace=TRUE, size=100),
>   hvar1=sample(c(1,2,3), replace=TRUE, size=100),
>   hvar2=sample(c(1,2,3), replace=TRUE, size=100),
>   evar1=sample(c(1,2,3), replace=TRUE, size=100),
>   evar2=sample(c(1,2,3), replace=TRUE, size=100)
>   )
>
> #data.frame2
>   df1<-data.frame(
>     ivar1=sample(c(1,2,3), replace=TRUE, size=100),
>     ivar2=sample(c(1,2,3), replace=TRUE, size=100),
>     hvar1=sample(c(1,2,3), replace=TRUE, size=100),
>     hvar2=sample(c(1,2,3), replace=TRUE, size=100),
>     evar1=sample(c(1,2,3), replace=TRUE, size=100),
>     evar2=sample(c(1,2,3), replace=TRUE, size=100)
>   )
>
> #List
> list1<-list(df, df1)
> #vector of first variables I’d like to recode
> i.recodes<-grep('^i.', names(df), value=TRUE)
> #Vector of second variables to recode
> e.recodes<-grep('^e.', names(df), value=TRUE)
>
> #Set up RESCALE function from RPMG package
> RESCALE <- function (x, nx1, nx2, minx, maxx)
> { nx = nx1 + (nx2 - nx1) * (x - minx)/(maxx - minx)
>   return(nx)
> }
>
> #This is what I’m playing around with
> test<-lapply(list1, function(y) {
>   out<-y[,i.recodes]
>   out<-lapply(out, function(x) RESCALE(x, 0,1,1,6))
>   y[,names(x)]<-out
> })
>         [[alternative HTML version deleted]]
>
> ______________________________________________
> [hidden email] <mailto:[hidden email]> mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help <https://stat.ethz.ch/mailman/listinfo/r-help>
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html <http://www.r-project.org/posting-guide.html>
> and provide commented, minimal, self-contained, reproducible code.
>


        [[alternative HTML version deleted]]

______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: recode the same subset of variables in several list elements

Jim Lemon-4
Hi Simon,
Let's see. If I wrap the code into a function:

reverse.df.elements<-function(df,pattern="i",newrange=c(3,1)) {
 revlist<-grep(pattern,names(df),fixed=TRUE)
 df[,revlist]<-sapply(df[,revlist],rescale,newrange)
 return(df)
}

Then this might do the trick:

lapply(list1,reverse.df.elements,pattern="i",newrange=c(3,1))

Allowing you to select which elements to reverse and specify the new range.

Jim


On Tue, Apr 7, 2015 at 12:33 AM, Simon Kiss <[hidden email]> wrote:

> Hi Jim, So that does the rescale part very efficiently. But I’d like to
> know how to do that on each list element using lapply or llply.  I have
> about 4 data frames and a few other recodes to do so automating would be
> nice, rather than applying your code to each individual list element.
> simon
>
> On Apr 2, 2015, at 6:30 PM, Jim Lemon <[hidden email]> wrote:
>
> Hi Simon,
> How about this?
>
> library(plotrix)
> revlist<-grep("i",names(df),fixed=TRUE)
> df[,revlist]<-sapply(df[,revlist],rescale,c(3,1))
>
> Jim
>
>
> On Fri, Apr 3, 2015 at 6:30 AM, Simon Kiss <[hidden email]> wrote:
>
>> Hi there: I have a list of data frames with identical variable  names.
>> I’d like to reverse scale the same variables in each data.frame.
>> I’d appreciate any one’s suggestions as to how to accomplish this. Right
>> now, I’m working with the code at the very bottom of my sample data.
>> Thanks, Simon Kiss
>>
>> #Create data.frame1
>> df<-data.frame(
>>   ivar1=sample(c(1,2,3), replace=TRUE, size=100),
>>   ivar2=sample(c(1,2,3), replace=TRUE, size=100),
>>   hvar1=sample(c(1,2,3), replace=TRUE, size=100),
>>   hvar2=sample(c(1,2,3), replace=TRUE, size=100),
>>   evar1=sample(c(1,2,3), replace=TRUE, size=100),
>>   evar2=sample(c(1,2,3), replace=TRUE, size=100)
>>   )
>>
>> #data.frame2
>>   df1<-data.frame(
>>     ivar1=sample(c(1,2,3), replace=TRUE, size=100),
>>     ivar2=sample(c(1,2,3), replace=TRUE, size=100),
>>     hvar1=sample(c(1,2,3), replace=TRUE, size=100),
>>     hvar2=sample(c(1,2,3), replace=TRUE, size=100),
>>     evar1=sample(c(1,2,3), replace=TRUE, size=100),
>>     evar2=sample(c(1,2,3), replace=TRUE, size=100)
>>   )
>>
>> #List
>> list1<-list(df, df1)
>> #vector of first variables I’d like to recode
>> i.recodes<-grep('^i.', names(df), value=TRUE)
>> #Vector of second variables to recode
>> e.recodes<-grep('^e.', names(df), value=TRUE)
>>
>> #Set up RESCALE function from RPMG package
>> RESCALE <- function (x, nx1, nx2, minx, maxx)
>> { nx = nx1 + (nx2 - nx1) * (x - minx)/(maxx - minx)
>>   return(nx)
>> }
>>
>> #This is what I’m playing around with
>> test<-lapply(list1, function(y) {
>>   out<-y[,i.recodes]
>>   out<-lapply(out, function(x) RESCALE(x, 0,1,1,6))
>>   y[,names(x)]<-out
>> })
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> [hidden email] 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
>> <http://www.r-project.org/posting-guide.html>
>> and provide commented, minimal, self-contained, reproducible code.
>
>
>
>

        [[alternative HTML version deleted]]

______________________________________________
[hidden email] 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.