[R] reversed variables in stats::reshape()

arun smartpink111 at yahoo.com
Sat Jan 25 01:39:14 CET 2014



Another way would be to change the colnames() 
colnames(data1)[grep("min",colnames(data1))] <- gsub("(\\d+)\\D+(\\w+)$","\\2_\\1",colnames(data1)[grep("min",colnames(data1))])
varying1 <- colnames(data1)[3:32]
test2 <- reshape(
        data = data1,
        direction = "long",
        idvar = c("Participant","Treatment"),
       times= seq(2, 30, by = 2),
        timevar = "Time",
        varying = varying1,sep="_")
attr(test2,"reshapeLong") <- NULL
 attr(test,"reshapeLong") <- NULL
 identical(test,test2)
#[1] TRUE
A.K.


On Friday, January 24, 2014 7:28 PM, arun <smartpink111 at yahoo.com> wrote:
Hi,

You can change varying1 to:

varying1 = list(seq(3,ncol(data1),2), seq(4,ncol(data1),2))#and then try it on your code
test = reshape(
        data = data1,
        direction = "long",
        idvar = c("Participant","Treatment"),
        v.names = c("R","L"),
    times= seq(2, 30, by = 2),
        timevar = "Time",
        varying = varying1)


A.K.


Dear R-Help readers, 

I am writing to ask about some behavior by stats::reshape() that surprised 
me. In the example below, I expected the values of variables "R" and "L" in 
data.frame "test" to be the reverse of what they are - ie I expected that 
test$R = seq(1:29, by =2) and test$L = seq(2:30, by = 2). 

data1 = data.frame( 
        check.names = F, 
        Participant = 1, 
        Treatment = "A", "2 min R" = 1L, 
        "2 min L" = 2L, "4 min R" = 3L, "4 min L" = 4L, "6 min R" = 5L, 
        "6 min L" = 6L, "8 min R" = 7L, "8 min L" = 8L, "10 min R" = 9L, 
        "10 min L" = 10L, "12 min R" = 11L, "12 min L" = 12L, "14 min R" = 
13L, 
        "14 min L" = 14L, "16 min R" = 15L, "16 min L" = 16L, "18 min R" = 
17L, 
        "18 min L" = 18L, "20 min R" = 19L, "20 min L" = 20L, "22 min R" = 
21L, 
        "22 min L" = 22L, "24 min R" = 23L, "24 min L" = 24L, "26 min R" = 
25L, 
        "26 min L" = 26L, "28 min R" = 27L, "28 min L" = 28L, "30 min R" = 
29L, 
        "30 min L" = 30L) 

varying1 = colnames(data1)[3:32] 

test = reshape( 
        data = data1, 
        direction = "long", 
        idvar = c("Participant","Treatment"), 
        v.names = (c("R","L")), 
        timevar = "Time", 
        times = seq(2, 30, by = 2), 
        varying = varying1) 

test 

[ end code] 

I looked into the definition of reshape, and found the following line: 

varying <- split(varying, rep(v.names, ntimes)) 

The following edit seems to produce the behavior I expected: 

varying <- split(varying, rep(v.names, ntimes))[v.names] 

However, I strongly suspect I am making a mistake; I'd be grateful if 
someone would help me find it. 

Here is the output of  sessionInfo(): 

R version 3.0.2 (2013-09-25) 
Platform: x86_64-apple-darwin10.8.0 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] graphics  datasets  stats     utils     grDevices methods   base 

other attached packages: 
[1] rj_1.1.3-1 

loaded via a namespace (and not attached): 
[1] rj.gd_1.1.3-1 tools_3.0.2 

Thanks, 
Doug 





More information about the R-help mailing list