[R] R help

arun smartpink111 at yahoo.com
Thu Mar 20 17:56:10 CET 2014


Hi,
Another way would be:
dat11 <-  transform(dat[rep(1:nrow(dat),each=12),1:2], weekdatesunday=rep(0:11,3), RevenueWeekN00=as.vector(t(dat[,-c(1:2)])))
row.names(dat11) <- 1:nrow(dat11)
 
dat22 <- unsplit(lapply(split(dat11, with(dat11,list(customer_id,CountryName)),drop=TRUE),function(x) {m1 <- matrix(0,nrow(x), nrow(x)-1); d1 <- setNames(as.data.frame(sapply(1:ncol(m1), function(i) {m1[-seq(i),i] <- head(x$RevenueWeekN00,-i); m1[,i]})),colnames(dat)[-(1:3)]); cbind(x,d1)    }), with(dat11,list(customer_id,CountryName)),drop=TRUE)
attr(dat22,"row.names") <- attr(dat5,"row.names")
 all.equal(dat22,dat5)
#[1] TRUE
all.equal(res,dat22[1:24,])
#[1] TRUE
A.K.





On Thursday, March 20, 2014 11:11 AM, arun <smartpink111 at yahoo.com> wrote:
Hi,
It is better to use ?dput() to show the data.dput(dataset)

dat <- 

structure(list(customer_id = c(8L, 33L, 12L), CountryName = c("US", 
"CA", "UK"), RevenueWeekN00 = c(2.28, 0, 30.18), RevenueWeekN01 = c(9.57, 
14.69, 43.9), RevenueWeekN02 = c(7.54, 3.31, 90.4), RevenueWeekN03 = c(8.99, 
5.21, 45), RevenueWeekN04 = c(21.61, 1.95, 2.9), RevenueWeekN05 = c(24.46, 
1.51, 4.12), RevenueWeekN06 = c(19.45, 1.85, 19.72), RevenueWeekN07 = c(120.56, 
1.96, 30.8), RevenueWeekN08 = c(0.02, 4.88, 102.6), RevenueWeekN09 = c(0.15, 
3.55, 55.09), RevenueWeekN10 = c(0, 3.74, 25.3), RevenueWeekN11 = c(0, 
4.5, 4.6)), .Names = c("customer_id", "CountryName", "RevenueWeekN00", 
"RevenueWeekN01", "RevenueWeekN02", "RevenueWeekN03", "RevenueWeekN04", 
"RevenueWeekN05", "RevenueWeekN06", "RevenueWeekN07", "RevenueWeekN08", 
"RevenueWeekN09", "RevenueWeekN10", "RevenueWeekN11"), class = "data.frame", row.names = c(NA, 
-3L))


###Your expected output
res <- structure(list(customer_id = c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 33L, 
33L, 33L, 33L), CountryName = c("US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US", "CA", "CA", "CA", "CA", 
"CA", "CA", "CA", "CA", "CA", "CA", "CA", "CA"), weekdatesunday = c(0L, 
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 0L, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L), RevenueWeekN00 = c(2.28, 9.57, 
7.54, 8.99, 21.61, 24.46, 19.45, 120.56, 0.02, 0.15, 0, 0, 0, 
14.69, 3.31, 5.21, 1.95, 1.51, 1.85, 1.96, 4.88, 3.55, 3.74, 
4.5), RevenueWeekN01 = c(0, 2.28, 9.57, 7.54, 8.99, 21.61, 24.46, 
19.45, 120.56, 0.02, 0.15, 0, 0, 0, 14.69, 3.31, 5.21, 1.95, 
1.51, 1.85, 1.96, 4.88, 3.55, 3.74), RevenueWeekN02 = c(0, 0, 
2.28, 9.57, 7.54, 8.99, 21.61, 24.46, 19.45, 120.56, 0.02, 0.15, 
0, 0, 0, 14.69, 3.31, 5.21, 1.95, 1.51, 1.85, 1.96, 4.88, 3.55
), RevenueWeekN03 = c(0, 0, 0, 2.28, 9.57, 7.54, 8.99, 21.61, 
24.46, 19.45, 120.56, 0.02, 0, 0, 0, 0, 14.69, 3.31, 5.21, 1.95, 
1.51, 1.85, 1.96, 4.88), RevenueWeekN04 = c(0, 0, 0, 0, 2.28, 
9.57, 7.54, 8.99, 21.61, 24.46, 19.45, 120.56, 0, 0, 0, 0, 0, 
14.69, 3.31, 5.21, 1.95, 1.51, 1.85, 1.96), RevenueWeekN05 = c(0, 
0, 0, 0, 0, 2.28, 9.57, 7.54, 8.99, 21.61, 24.46, 19.45, 0, 0, 
0, 0, 0, 0, 14.69, 3.31, 5.21, 1.95, 1.51, 1.85), RevenueWeekN06 = c(0, 
0, 0, 0, 0, 0, 2.28, 9.57, 7.54, 8.99, 21.61, 24.46, 0, 0, 0, 
0, 0, 0, 0, 14.69, 3.31, 5.21, 1.95, 1.51), RevenueWeekN07 = c(0, 
0, 0, 0, 0, 0, 0, 2.28, 9.57, 7.54, 8.99, 21.61, 0, 0, 0, 0, 
0, 0, 0, 0, 14.69, 3.31, 5.21, 1.95), RevenueWeekN08 = c(0, 0, 
0, 0, 0, 0, 0, 0, 2.28, 9.57, 7.54, 8.99, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 14.69, 3.31, 5.21), RevenueWeekN09 = c(0, 0, 0, 0, 0, 0, 
0, 0, 0, 2.28, 9.57, 7.54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.69, 
3.31), RevenueWeekN10 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.28, 
9.57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14.69), RevenueWeekN11 = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0)), .Names = c("customer_id", "CountryName", "weekdatesunday", 
"RevenueWeekN00", "RevenueWeekN01", "RevenueWeekN02", "RevenueWeekN03", 
"RevenueWeekN04", "RevenueWeekN05", "RevenueWeekN06", "RevenueWeekN07", 
"RevenueWeekN08", "RevenueWeekN09", "RevenueWeekN10", "RevenueWeekN11"
), class = "data.frame", row.names = c(NA, -24L))


dat1 <- dat
names(dat1)[-(1:2)] <- gsub("([[:alpha:]]+)(\\d+)","\\1_\\2",names(dat1)[-(1:2)])
 dat2 <- reshape(dat1,idvar=1:2,sep="_",direction="long",varying=names(dat1)[-(1:2)],timevar="weekdatesunday")

dat3 <-  dat2[with(dat2,order(factor(CountryName,levels=dat1$CountryName),customer_id)),]
row.names(dat3) <- 1:nrow(dat3)
colnames(dat3)[4] <- paste0(colnames(dat3)[4], "00") 

#Better would be to use a ?for() loop.  If you only need 12 lags:
library(plyr)

dat4 <- ddply(dat3,.(CountryName),mutate,RevenueWeekN01=c(0,head(RevenueWeekN00,-1)), RevenueWeekN02=c(0,head(RevenueWeekN01,-1)), RevenueWeekN03=c(0,head(RevenueWeekN02,-1)), RevenueWeekN04=c(0,head(RevenueWeekN03,-1)), RevenueWeekN05=c(0,head(RevenueWeekN04,-1)), RevenueWeekN06=c(0,head(RevenueWeekN05,-1)), RevenueWeekN07=c(0,head(RevenueWeekN06,-1)), RevenueWeekN08=c(0,head(RevenueWeekN07,-1)), RevenueWeekN09=c(0,head(RevenueWeekN08,-1)), RevenueWeekN10=c(0,head(RevenueWeekN09,-1)), RevenueWeekN11=c(0,head(RevenueWeekN10,-1)))
dat5 <- dat4[with(dat4,order(factor(CountryName,levels=dat1$CountryName),customer_id)),]
row.names(dat5) <- 1:nrow(dat5)
 all.equal(res, dat5[1:24,])
#[1] TRUE
A.K.






On Thursday, March 20, 2014 6:22 AM, Malyadri Putchakayala <malyadri.putchakayala at nuevora.com> wrote:

Hi,
if u doen't mind plz...help me lagitude Transpose,the data is give below 

customer_id    CountryName    RevenueWeekN00    RevenueWeekN01
RevenueWeekN02    RevenueWeekN03    RevenueWeekN04    RevenueWeekN05
RevenueWeekN06    RevenueWeekN07    RevenueWeekN08    RevenueWeekN09
RevenueWeekN10    RevenueWeekN11
8    US    2.28    9.57    7.54    8.99    21.61    24.46    19.45
120.56    0.02    0.15    0    0
33    CA    0    14.69    3.31    5.21    1.95    1.51    1.85    1.96
4.88    3.55    3.74    4.5
12    UK    30.18    43.9    90.4    45    2.9    4.12    19.72    30.8
102.6    55.09    25.30    4.6    

after transpose output is 

customer_id    CountryName    weekdatesunday    RevenueWeekN00
RevenueWeekN01    RevenueWeekN02    RevenueWeekN03    RevenueWeekN04
RevenueWeekN05    RevenueWeekN06    RevenueWeekN07    RevenueWeekN08
RevenueWeekN09    RevenueWeekN10    RevenueWeekN11
8    US    0    2.28    0    0    0    0    0    0
0    0    0    0    0
8    US    1    9.57    2.28    0    0    0    0    0
0    0    0    0    0
8    US    2    7.54    9.57    2.28    0    0    0    0
0    0    0    0    0
8    US    3    8.99    7.54    9.57    2.28    0    0    0
0    0    0    0    0
8    US    4    21.61    8.99    7.54    9.57    2.28    0    0
0    0    0    0    0
8    US    5    24.46    21.61    8.99    7.54    9.57    2.28    0
0    0    0    0    0
8    US    6    19.45    24.46    21.61    8.99    7.54    9.57    2.28
0    0    0    0    0
8    US    7    120.56    19.45    24.46    21.61    8.99    7.54    9.57
2.28    0    0    0    0
8    US    8    0.02    120.56    19.45    24.46    21.61    8.99    7.54
9.57    2.28    0    0    0
8    US    9    0.15    0.02    120.56    19.45    24.46    21.61    8.99
7.54    9.57    2.28    0    0
8    US    10    0    0.15    0.02    120.56    19.45    24.46
21.61    8.99    7.54    9.57    2.28    0
8    US    11    0    0    0.15    0.02    120.56    19.45
24.46    21.61    8.99    7.54    9.57    2.28
33    CA    0    0    0    0    0    0    0    0
0    0    0    0    0
33    CA    1    14.69    0    0    0    0    0    0
0    0    0    0    0
33    CA    2    3.31    14.69    0    0    0    0    0
0    0    0    0    0
33    CA    3    5.21    3.31    14.69    0    0    0    0
0    0    0    0    0
33    CA    4    1.95    5.21    3.31    14.69    0    0    0
0    0    0    0    0
33    CA    5    1.51    1.95    5.21    3.31    14.69    0    0
0    0    0    0    0
33    CA    6    1.85    1.51    1.95    5.21    3.31    14.69    0
0    0    0    0    0
33    CA    7    1.96    1.85    1.51    1.95    5.21    3.31
14.69    0    0    0    0    0
33    CA    8    4.88    1.96    1.85    1.51    1.95    5.21    3.31
14.69    0    0    0    0
33    CA    9    3.55    4.88    1.96    1.85    1.51    1.95    5.21
3.31    14.69    0    0    0
33    CA    10    3.74    3.55    4.88    1.96    1.85    1.51    1.95
5.21    3.31    14.69    0    0
33    CA    11    4.5    3.74    3.55    4.88    1.96    1.85    1.51
1.95    5.21    3.31    14.69    0

above output add newcolumn weekdatesunday is seq of 0:11 each record




More information about the R-help mailing list