Hi, You could try: A<- matrix(unlist(read.table(text=" 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 ",sep="",header=FALSE)),ncol=3,byrow=FALSE,dimnames=NULL) library(matrixStats) ?res1<-t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),colProds)) ?res1 #? [,1] [,2] [,3] #1??? 4?? 10?? 18 #2?? 63?? 64?? 63 #3?? 18?? 10??? 4 ?res2<-t(sapply(split(as.data.frame(A),((seq_len(nrow(A))-1)%/%2)+1),colProds)) ?identical(res1,res2) #[1] TRUE #or ?t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),function(x) apply(x,2,prod))) #or library(plyr) ?as.matrix(ddply(as.data.frame(A),.(as.numeric(gl(nrow(A),2,6))),colProds)[,-1]) #???? V1 V2 V3 #[1,]? 4 10 18 #[2,] 63 64 63 #[3,] 18 10? 4 #or do.call(rbind,tapply(seq_len(nrow(A)),list(as.numeric(gl(nrow(A),2,6))),FUN=function(x) colProds(A[x,]))) #or A1<- data.frame(A,ID=as.numeric(gl(nrow(At),2,6))) ?aggregate(A1[,-4],list(A1[,4]),colProds)[,-1] #? X1 X2 X3 #1? 4 10 18 #2 63 64 63 #3 18 10? 4 #or library(data.table) At<- data.table(A1,key='ID') subset(At[,lapply(.SD,colProds),by=ID],select=-1) #?? X1 X2 X3 #1:? 4 10 18 #2: 63 64 63 #3: 18 10? 4 A.K. Hello, I have this matrix : A = 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 I would like to have this matrix (product of rows 2 by 2) : A = 4 10 18 63 64 63 18 10 4 Is it possible to do that without a loop ? Thank you in advance !
These elaborate manipulations are unnecessary and inefficient. Use indexing
instead:
j <- 2*seq_len(nrow(A)/2)
b <- A[j,]*A[j-1,]
b
[,1] [,2] [,3]
[1,] 4 10 18
[2,] 63 64 63
[3,] 18 10 4
[,1] [,2] [,3]
[1,] 4 10 18
[2,] 63 64 63
[3,] 18 10 4
[,1] [,2] [,3]
[1,] 4 10 18
[2,] 63 64 63
[3,] 18 10 4
[,1] [,2] [,3]
[1,] 4 10 18
[2,] 63 64 63
[3,] 18 10 4
[,1] [,2] [,3]
[1,] 4 10 18
[2,] 63 64 63
[3,] 18 10 4
On Mon, Sep 2, 2013 at 7:25 AM, arun <smartpink111@yahoo.com> wrote:
> Hi,
> You could try:
>
> A<- matrix(unlist(read.table(text="
> 1 2 3
> 4 5 6
> 7 8 9
> 9 8 7
> 6 5 4
> 3 2 1
> ",sep="",header=FALSE)),ncol=3,byrow=FALSE,dimnames=NULL)
>
> library(matrixStats)
>
>
res1<-t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),colProds))
> res1
> # [,1] [,2] [,3]
> #1 4 10 18
> #2 63 64 63
> #3 18 10 4
>
>
>
>
res2<-t(sapply(split(as.data.frame(A),((seq_len(nrow(A))-1)%/%2)+1),colProds))
> identical(res1,res2)
> #[1] TRUE
>
> #or
> t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),function(x)
> apply(x,2,prod)))
>
> #or
> library(plyr)
>
>
as.matrix(ddply(as.data.frame(A),.(as.numeric(gl(nrow(A),2,6))),colProds)[,-1])
> # V1 V2 V3
> #[1,] 4 10 18
> #[2,] 63 64 63
> #[3,] 18 10 4
>
> #or
>
do.call(rbind,tapply(seq_len(nrow(A)),list(as.numeric(gl(nrow(A),2,6))),FUN=function(x)
> colProds(A[x,])))
> #or
> A1<- data.frame(A,ID=as.numeric(gl(nrow(At),2,6)))
> aggregate(A1[,-4],list(A1[,4]),colProds)[,-1]
> # X1 X2 X3
> #1 4 10 18
> #2 63 64 63
> #3 18 10 4
>
> #or
> library(data.table)
> At<- data.table(A1,key='ID')
> subset(At[,lapply(.SD,colProds),by=ID],select=-1)
> # X1 X2 X3
> #1: 4 10 18
> #2: 63 64 63
> #3: 18 10 4
>
> A.K.
>
>
>
>
> Hello,
>
> I have this matrix :
> A > 1 2 3
> 4 5 6
> 7 8 9
> 9 8 7
> 6 5 4
> 3 2 1
>
> I would like to have this matrix (product of rows 2 by 2) :
> A > 4 10 18
> 63 64 63
> 18 10 4
>
> Is it possible to do that without a loop ?
>
> Thank you in advance !
>
> ______________________________________________
> R-help@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.
>
--
Bert Gunter
Genentech Nonclinical Biostatistics
Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
[[alternative HTML version deleted]]
Hi,
You can try this:
n<- 3
j3<-n*seq_len(nrow(A)/n)
vec1<- rep("j3",n)
eval(parse(text=paste0("A","[",paste0(vec1,"-",seq(n)-1),",]",collapse="*")))
#???? [,1] [,2] [,3]
#[1,]?? 28?? 80? 162
#[2,]? 162?? 80?? 28
Just saw Bert's new solution:
n<-3
?j <- seq_len(nrow(A))%%n
?b <- A[j==0,]
?for(i in seq_len(n-1))b <- b*A[j==i,]
?b
#???? [,1] [,2] [,3]
#[1,]?? 28?? 80? 162
#[2,]? 162?? 80?? 28
#For the bigger dataset with large "n, these methods may not work:
set.seed(28)
mat1<- matrix(sample(1:20,1e5*3,replace=TRUE),ncol=3)
n<- 40
nrow(mat1)%%40
#[1] 0
j <- seq_len(nrow(mat1))%%n
b <- mat1[j==0,]
for(i in seq_len(n-1))b <- b*mat1[j==i,]
Warning messages:
1: In b * mat1[j == i, ] : NAs produced by integer overflow
2: In b * mat1[j == i, ] : NAs produced by integer overflow
3: In b * mat1[j == i, ] : NAs produced by integer overflow
4: In b * mat1[j == i, ] : NAs produced by integer overflow
5: In b * mat1[j == i, ] : NAs produced by integer overflow
6: In b * mat1[j == i, ] : NAs produced by integer overflow
7: In b * mat1[j == i, ] : NAs produced by integer overflow
8: In b * mat1[j == i, ] : NAs produced by integer overflow
9: In b * mat1[j == i, ] : NAs produced by integer overflow
10: In b * mat1[j == i, ] : NAs produced by integer overflow
head(b,3)
#???? [,1] [,2] [,3]
#[1,]?? NA?? NA?? NA
#[2,]?? NA?? NA?? NA
#[3,]?? NA?? NA?? NA
j40<- n*seq_len(nrow(mat1)/n)
?vec1<- rep("j40",n)
?vec1<- rep("j22",n)
?res<- eval(parse(text=
paste(paste0("mat1","[",paste0(vec1,"-",seq(n)-1),",]"),collapse="*")
?))
Warning messages:
1: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
? NAs produced by integer overflow
2: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
? NAs produced by integer overflow
3: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
? NAs produced by integer overflow
4: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
?head(res,3)
#???? [,1] [,2] [,3]
#[1,]?? NA?? NA?? NA
#[2,]?? NA?? NA?? NA
#[3,]?? NA?? NA?? NA
A.K.
________________________________
From: Edouard Hardy <hardy.edouard at gmail.com>
To: arun <smartpink111 at yahoo.com>
Sent: Monday, September 2, 2013 2:32 PM
Subject: Re: [R] Product of certain rows in a matrix
Yes, n is 250 or more...
Edouard Hardy
On Mon, Sep 2, 2013 at 8:31 PM, arun <smartpink111 at yahoo.com> wrote:
Also, BTW, are you looking for n>100?>
>
>
>
>
>
On Mon, Sep 2, 2013 at 8:27 PM, arun <smartpink111 at yahoo.com> wrote:
>
>Hi,
>
>Not sure I understand your question.? If you don't know "n",
then how are you applying other solutions also..
>A.K.
>
>
>
>Again, thank you for your help.
>
>I understand Bert's solution but this is possible only if I know n.
>
>How can I do A[j3,]*A[j3-1,]*A[j3-2,] (n=3) for n terms ?
>
>
>
>----- Original Message -----
>From: arun <smartpink111 at yahoo.com>
>To: Edouard Hardy <hardy.edouard at gmail.com>
>Cc: R help <r-help at r-project.org>; Bert Gunter <gunter.berton at
gene.com>
>
>Sent: Monday, September 2, 2013 1:57 PM
>Subject: Re: [R] Product of certain rows in a matrix
>
>HI,
>You could modify Bert's solution:
>n<-3
>
>j3<-n*seq_len(nrow(A)/n)
>A[j3,]*A[j3-1,]*A[j3-2,]? ##assuming that nrow(dataset)%%n==0
>#???? [,1] [,2] [,3]
>#[1,]?? 28?? 80? 162
>#[2,]? 162?? 80?? 28
>
>
>#Speed comparison
>
>
>set.seed(28)
>mat1<- matrix(sample(1:20,1e5*3,replace=TRUE),ncol=3)
>
>n<-4
>system.time({res1<-
t(sapply(split(as.data.frame(mat1),as.numeric(gl(nrow(mat1),n,nrow(mat1)))),function(x)
apply(x,2,prod))) })
>#? user? system elapsed
>#? 8.508?? 0.620?? 9.146
>system.time({res2<-
t(sapply(split(as.data.frame(mat1),as.numeric(gl(nrow(mat1),n,nrow(mat1)))),function(x)
Reduce("*",as.data.frame(t(x))))) })
># user? system elapsed
>#? 8.556?? 0.000?? 8.566
>
>A1<- data.frame(mat1,ID=as.numeric(gl(nrow(mat1),n,nrow(mat1))))
>?system.time({res3<- aggregate(A1[,-4],list(A1[,4]),colProds)[,-1]})
># user? system elapsed
># 11.536?? 0.000? 11.553
>
>
>nrow(mat1)%%n
>#[1] 0
>system.time({j4<- n*seq_len(nrow(mat1)/n)
>??? ??? res5<- mat1[j4,]*mat1[j4-1,]*mat1[j4-2,]*mat1[j4-3,]
>??? ? })
>
># user? system elapsed
>#? 0.004?? 0.000?? 0.004
>
>?dimnames(res2)<- dimnames(res5)
>identical(res2,res5)
>#[1] TRUE
>
>
>#if
>n<-6
>?nrow(mat1)%%6
>#[1] 4
>
>
>system.time({
>?mat2<-mat1[seq(nrow(mat1)-4),]
>j6<- n*seq_len(nrow(mat2)/n)
>?res6<-
mat2[j6,]*mat2[j6-1,]*mat2[j6-2,]*mat2[j6-3,]*mat2[j6-4,]*mat2[j6-5,]
>res6New<-rbind(res6,apply(tail(mat1,4),2,prod)
>)})
>
>#? user? system elapsed
>?# 0.004?? 0.000?? 0.006
>
>
>
>system.time({res6Alt<-
>t(sapply(split(as.data.frame(mat1),as.numeric(gl(nrow(mat1),n,nrow(mat1)))),function(x)
Reduce("*",as.data.frame(t(x))))) })
>#user? system elapsed
>?# 5.576?? 0.000?? 5.583
>dimnames(res6Alt)<- dimnames(res6New)
>
>
>all.equal(res6New,res6Alt)
>#[1] TRUE
>
>
>A.K.
>
>
>
>As you said, this is very loooong.
>Do you have a better solution on big data ?
>
>
>
>----- Original Message -----
>From: arun <smartpink111 at yahoo.com>
>To: Edouard Hardy <hardy.edouard at gmail.com>
>Cc: R help <r-help at r-project.org>; Bert Gunter <gunter.berton at
gene.com>
>Sent: Monday, September 2, 2013 12:07 PM
>Subject: Re: [R] Product of certain rows in a matrix
>
>
>
>Hi,
>No problem.
>n<- 4
>
>t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),function(x)
apply(x,2,prod)))?
>
>#? V1? V2?? V3
>#1 252 640 1134
>#2? 18? 30?? 20
>
>
>This could be a bit slow if you have big dataset.
>
>
>A.K.
>
>
>
>________________________________
>From: Edouard Hardy <hardy.edouard at gmail.com>
>To: arun <smartpink111 at yahoo.com>
>Cc: R help <r-help at r-project.org>
>Sent: Monday, September 2, 2013 11:58 AM
>Subject: Re: [R] Product of certain rows in a matrix
>
>
>
>Thank you A.K.
>And do you have a solution without installing any package ?
>Thank you in advance.
>E.H.
>
>
>
>Edouard Hardy
>
>
>
>On Mon, Sep 2, 2013 at 5:56 PM, arun <smartpink111 at yahoo.com>
wrote:
>
>
>>
>>HI,
>>In my first solutions:
>>?n<-3
>>?t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),colProds))
>>#? [,1] [,2] [,3]
>>#1?? 28?? 80? 162
>>#2? 162?? 80?? 28
>>#3??? 1??? 3??? 5
>>?n<-4
>>?t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),colProds))
>>#? [,1] [,2] [,3]
>>#1? 252? 640 1134
>>#2?? 18?? 30?? 20
>>
>>A.K.
>>
>>________________________________
>>From: Edouard Hardy <hardy.edouard at gmail.com>
>>To: arun <smartpink111 at yahoo.com>
>>Cc: Bert Gunter <gunter.berton at gene.com>; R help <r-help at
r-project.org>
>>Sent: Monday, September 2, 2013 11:46 AM
>>
>>Subject: Re: [R] Product of certain rows in a matrix
>>
>>
>>
>>Thank you all for your responses.
>>The real problem is that all your answer work for products 2 by 2.
>>I now have to do the product n by n row.
>>Do you have a solution ?
>>Thank you in advance,
>>E.H.?
>>
>>
>>
>>Edouard Hardy
>>
>>
>>
>>On Mon, Sep 2, 2013 at 5:43 PM, arun <smartpink111 at yahoo.com>
wrote:
>>
>>I guess in such situations,
>>>
>>>
>>>fun1<- function(mat){
>>>?if(nrow(mat)%%2==0){
>>>?j<- 2*seq_len(nrow(mat)/2)
>>>?b<- mat[j,]* mat[j-1,]
>>>?}
>>>?else {mat1<- mat[-nrow(mat),]
>>>?j<- 2*seq_len(nrow(mat1)/2)
>>>?b<- rbind(mat1[j,]*mat1[j-1,],mat[nrow(mat),])
>>>? }
>>>b
>>>}
>>>fun1(A)
>>>#???? [,1] [,2] [,3]
>>>
>>>#[1,]??? 4?? 10?? 18
>>>#[2,]?? 63?? 64?? 63
>>>#[3,]?? 18?? 10??? 4
>>>?fun1(Anew)
>>>#???? [,1] [,2] [,3]
>>>
>>>#[1,]??? 4?? 10?? 18
>>>#[2,]?? 63?? 64?? 63
>>>#[3,]?? 18?? 10??? 4
>>>#[4,]??? 1??? 3??? 5
>>>
>>>
>>>A.K.
>>>
>>>
>>>
>>>
>>>----- Original Message -----
>>>From: arun <smartpink111 at yahoo.com>
>>>To: Bert Gunter <gunter.berton at gene.com>
>>>Cc: R help <r-help at r-project.org>
>>>
>>>Sent: Monday, September 2, 2013 11:26 AM
>>>Subject: Re: [R] Product of certain rows in a matrix
>>>
>>>Hi Bert,
>>>Thanks.? It is a better solution.
>>>
>>>If nrow() is not even.
>>>
>>>Anew<- rbind(A,c(1,3,5))
>>>j<-seq_len(nrow(Anew)/2)###
>>>?Anew[j,]*Anew[j-1,]
>>>#Error in Anew[j, ] * Anew[j - 1, ] : non-conformable arrays
>>>
>>>t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),2,7))),colProds))
>>>? [,1] [,2] [,3]
>>>1??? 4?? 10?? 18
>>>2?? 63?? 64?? 63
>>>3?? 18?? 10??? 4
>>>4??? 1??? 3??? 5
>>>
>>>A.K.
>>>
>>>
>>>
>>>
>>>
>>>
>>>________________________________
>>>From: Bert Gunter <gunter.berton at gene.com>
>>>To: arun <smartpink111 at yahoo.com>
>>>Cc: R help <r-help at r-project.org>
>>>Sent: Monday, September 2, 2013 10:55 AM
>>>Subject: Re: [R] Product of certain rows in a matrix
>>>
>>>
>>>
>>>These elaborate manipulations are unnecessary and inefficient. Use
indexing instead:
>>>
>>>j <- 2*seq_len(nrow(A)/2)
>>>b <- A[j,]*A[j-1,]
>>>b
>>>[,1] [,2] [,3]
>>>[1,]??? 4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10??? 4
>>>
>>>[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4
>>>[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4
>>>[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4
>>>
>>>
>>>
>>>
>>>
>>>On Mon, Sep 2, 2013 at 7:25 AM, arun <smartpink111 at
yahoo.com> wrote:
>>>
>>>Hi,
>>>>You could try:
>>>>
>>>>A<- matrix(unlist(read.table(text="
>>>>1 2 3
>>>>4 5 6
>>>>7 8 9
>>>>9 8 7
>>>>6 5 4
>>>>3 2 1
>>>>",sep="",header=FALSE)),ncol=3,byrow=FALSE,dimnames=NULL)
>>>>
>>>>library(matrixStats)
>>>>?res1<-t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),colProds))
>>>>?res1
>>>>#? [,1] [,2] [,3]
>>>>#1??? 4?? 10?? 18
>>>>#2?? 63?? 64?? 63
>>>>#3?? 18?? 10??? 4
>>>>
>>>>
>>>>?res2<-t(sapply(split(as.data.frame(A),((seq_len(nrow(A))-1)%/%2)+1),colProds))
>>>>?identical(res1,res2)
>>>>#[1] TRUE
>>>>
>>>>#or
>>>>?t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),function(x)
apply(x,2,prod)))
>>>>
>>>>#or
>>>>library(plyr)
>>>>?as.matrix(ddply(as.data.frame(A),.(as.numeric(gl(nrow(A),2,6))),colProds)[,-1])
>>>>#???? V1 V2 V3
>>>>#[1,]? 4 10 18
>>>>#[2,] 63 64 63
>>>>#[3,] 18 10? 4
>>>>
>>>>#or
>>>>do.call(rbind,tapply(seq_len(nrow(A)),list(as.numeric(gl(nrow(A),2,6))),FUN=function(x)
colProds(A[x,])))
>>>>#or
>>>>A1<- data.frame(A,ID=as.numeric(gl(nrow(At),2,6)))
>>>>?aggregate(A1[,-4],list(A1[,4]),colProds)[,-1]
>>>>#? X1 X2 X3
>>>>#1? 4 10 18
>>>>#2 63 64 63
>>>>#3 18 10? 4
>>>>
>>>>#or
>>>>library(data.table)
>>>>At<- data.table(A1,key='ID')
>>>>subset(At[,lapply(.SD,colProds),by=ID],select=-1)
>>>>#?? X1 X2 X3
>>>>#1:? 4 10 18
>>>>#2: 63 64 63
>>>>#3: 18 10? 4
>>>>
>>>>A.K.
>>>>
>>>>
>>>>
>>>>
>>>>Hello,
>>>>
>>>>I have this matrix :
>>>>A >>>>1 2 3
>>>>4 5 6
>>>>7 8 9
>>>>9 8 7
>>>>6 5 4
>>>>3 2 1
>>>>
>>>>I would like to have this matrix (product of rows 2 by 2) :
>>>>A >>>>4 10 18
>>>>63 64 63
>>>>18 10 4
>>>>
>>>>Is it possible to do that without a loop ?
>>>>
>>>>Thank you in advance !
>>>>
>>>>______________________________________________
>>>>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.
>>>>
>>>
>>>
>>>--
>>>
>>>
>>>Bert Gunter
>>>Genentech Nonclinical Biostatistics
>>>
>>>Internal Contact Info:
>>>Phone: 467-7374
>>>Website:
>>>
>>>http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
>>>
>>>______________________________________________
>>>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.
>>>
>>
>
Hi,
Make sure you check the class of the columns.? I forgot about that.
str(mat1)
?int [1:100000, 1:3] 1 2 10 18 2 16 1 18 12 19 ...
Convert it to numeric.
mat1New<- sapply(split(mat1,col(mat1)),as.numeric)
n<- 40
nrow(mat1New)%%40
#[1] 0
system.time({
j40<- n*seq_len(nrow(mat1New)/n)
?vec1<- rep("j40",n)
? res<- eval(parse(text=
paste(paste0("mat1New","[",paste0(vec1,"-",seq(n)-1),",]"),collapse="*")
?))
})
?#user? system elapsed
?# 0.004?? 0.000?? 0.004
system.time({
j <- seq_len(nrow(mat1New))%%n
b <- mat1New[j==0,]
for(i in seq_len(n-1))b <- b*mat1New[j==i,]
})
# user? system elapsed
#? 0.112?? 0.000?? 0.116
all.equal(b,res)
#[1] TRUE
#if
nrow(mat1New)%%n!=0
For example:
n<- 22
nrow(mat1New)%%n
#[1] 10
system.time({
?mat2<-mat1New[seq(nrow(mat1New)-10),]
j22<- n*seq_len(nrow(mat2)/n)
vec1<- rep("j22",n)
res<- eval(parse(text=
paste(paste0("mat2","[",paste0(vec1,"-",seq(n)-1),",]"),collapse="*")
))
resNew<-rbind(res,apply(tail(mat1New,10),2,prod)
)})
#? user? system elapsed
?# 0.008?? 0.000?? 0.007
A.K.
----- Original Message -----
From: arun <smartpink111 at yahoo.com>
To: Edouard Hardy <hardy.edouard at gmail.com>
Cc: Bert Gunter <gunter.berton at gene.com>
Sent: Monday, September 2, 2013 3:31 PM
Subject: Re: [R] Product of certain rows in a matrix
There was a slight mistake in the end:
I repeated vec1.? But, it doesn't matter as the warning messages are the
same.
j40<- n*seq_len(nrow(mat1)/n)
?vec1<- rep("j40",n)
?res<- eval(parse(text=
paste(paste0("mat1","[",paste0(vec1,"-",seq(n)-1),",]"),collapse="*")
?))
Warning messages:
1: In mat1[j40 - 0, ] * mat1[j40 - 1, ] * mat1[j40 - 2, ] * mat1[j40 -? :
? NAs produced by integer overflow
2: In mat1[j40 - 0, ] * mat1[j40 - 1, ] * mat1[j40 - 2, ] * mat1[j40 -? :
? NAs produced by integer overflow
3: In mat1[j40 - 0, ] * mat1[j40 - 1, ] * mat1[j40 - 2, ] * mat1[j40 -? :
? NAs produced by integer overflow
4: In mat1[j40 - 0, ] * mat1[j40 - 1, ] * mat1[j40 - 2, ] * mat1[j40 -? :
? NAs produced by integer overflow
5: In mat1[j40 - 0, ] * mat1[j40 - 1, ] * mat1[j40 - 2, ] * mat1[j40 -? :
? NAs produced by integer overflow
6: In mat1[j40 - 0, ] * mat1[j40 - 1, ] * mat1[j40 - 2, ] * mat1[j40 -? :
----- Original Message -----
From: arun <smartpink111 at yahoo.com>
To: Edouard Hardy <hardy.edouard at gmail.com>
Cc: R help <r-help at r-project.org>; Bert Gunter <gunter.berton at
gene.com>
Sent: Monday, September 2, 2013 3:25 PM
Subject: Re: [R] Product of certain rows in a matrix
Hi,
You can try this:
n<- 3
j3<-n*seq_len(nrow(A)/n)
vec1<- rep("j3",n)
eval(parse(text=paste0("A","[",paste0(vec1,"-",seq(n)-1),",]",collapse="*")))
#???? [,1] [,2] [,3]
#[1,]?? 28?? 80? 162
#[2,]? 162?? 80?? 28
Just saw Bert's new solution:
n<-3
?j <- seq_len(nrow(A))%%n
?b <- A[j==0,]
?for(i in seq_len(n-1))b <- b*A[j==i,]
?b
#???? [,1] [,2] [,3]
#[1,]?? 28?? 80? 162
#[2,]? 162?? 80?? 28
#For the bigger dataset with large "n, these methods may not work:
set.seed(28)
mat1<- matrix(sample(1:20,1e5*3,replace=TRUE),ncol=3)
n<- 40
nrow(mat1)%%40
#[1] 0
j <- seq_len(nrow(mat1))%%n
b <- mat1[j==0,]
for(i in seq_len(n-1))b <- b*mat1[j==i,]
Warning messages:
1: In b * mat1[j == i, ] : NAs produced by integer overflow
2: In b * mat1[j == i, ] : NAs produced by integer overflow
3: In b * mat1[j == i, ] : NAs produced by integer overflow
4: In b * mat1[j == i, ] : NAs produced by integer overflow
5: In b * mat1[j == i, ] : NAs produced by integer overflow
6: In b * mat1[j == i, ] : NAs produced by integer overflow
7: In b * mat1[j == i, ] : NAs produced by integer overflow
8: In b * mat1[j == i, ] : NAs produced by integer overflow
9: In b * mat1[j == i, ] : NAs produced by integer overflow
10: In b * mat1[j == i, ] : NAs produced by integer overflow
head(b,3)
#???? [,1] [,2] [,3]
#[1,]?? NA?? NA?? NA
#[2,]?? NA?? NA?? NA
#[3,]?? NA?? NA?? NA
j40<- n*seq_len(nrow(mat1)/n)
?vec1<- rep("j40",n)
?vec1<- rep("j22",n)
?res<- eval(parse(text=
paste(paste0("mat1","[",paste0(vec1,"-",seq(n)-1),",]"),collapse="*")
?))
Warning messages:
1: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
? NAs produced by integer overflow
2: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
? NAs produced by integer overflow
3: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
? NAs produced by integer overflow
4: In mat1[j22 - 0, ] * mat1[j22 - 1, ] * mat1[j22 - 2, ] * mat1[j22 -? :
?head(res,3)
#???? [,1] [,2] [,3]
#[1,]?? NA?? NA?? NA
#[2,]?? NA?? NA?? NA
#[3,]?? NA?? NA?? NA
A.K.
________________________________
From: Edouard Hardy <hardy.edouard at gmail.com>
To: arun <smartpink111 at yahoo.com>
Sent: Monday, September 2, 2013 2:32 PM
Subject: Re: [R] Product of certain rows in a matrix
Yes, n is 250 or more...
Edouard Hardy
On Mon, Sep 2, 2013 at 8:31 PM, arun <smartpink111 at yahoo.com> wrote:
Also, BTW, are you looking for n>100?>
>
>
>
>
>
On Mon, Sep 2, 2013 at 8:27 PM, arun <smartpink111 at yahoo.com> wrote:
>
>Hi,
>
>Not sure I understand your question.? If you don't know "n",
then how are you applying other solutions also..
>A.K.
>
>
>
>Again, thank you for your help.
>
>I understand Bert's solution but this is possible only if I know n.
>
>How can I do A[j3,]*A[j3-1,]*A[j3-2,] (n=3) for n terms ?
>
>
>
>----- Original Message -----
>From: arun <smartpink111 at yahoo.com>
>To: Edouard Hardy <hardy.edouard at gmail.com>
>Cc: R help <r-help at r-project.org>; Bert Gunter <gunter.berton at
gene.com>
>
>Sent: Monday, September 2, 2013 1:57 PM
>Subject: Re: [R] Product of certain rows in a matrix
>
>HI,
>You could modify Bert's solution:
>n<-3
>
>j3<-n*seq_len(nrow(A)/n)
>A[j3,]*A[j3-1,]*A[j3-2,]? ##assuming that nrow(dataset)%%n==0
>#???? [,1] [,2] [,3]
>#[1,]?? 28?? 80? 162
>#[2,]? 162?? 80?? 28
>
>
>#Speed comparison
>
>
>set.seed(28)
>mat1<- matrix(sample(1:20,1e5*3,replace=TRUE),ncol=3)
>
>n<-4
>system.time({res1<-
t(sapply(split(as.data.frame(mat1),as.numeric(gl(nrow(mat1),n,nrow(mat1)))),function(x)
apply(x,2,prod))) })
>#? user? system elapsed
>#? 8.508?? 0.620?? 9.146
>system.time({res2<-
t(sapply(split(as.data.frame(mat1),as.numeric(gl(nrow(mat1),n,nrow(mat1)))),function(x)
Reduce("*",as.data.frame(t(x))))) })
># user? system elapsed
>#? 8.556?? 0.000?? 8.566
>
>A1<- data.frame(mat1,ID=as.numeric(gl(nrow(mat1),n,nrow(mat1))))
>?system.time({res3<- aggregate(A1[,-4],list(A1[,4]),colProds)[,-1]})
># user? system elapsed
># 11.536?? 0.000? 11.553
>
>
>nrow(mat1)%%n
>#[1] 0
>system.time({j4<- n*seq_len(nrow(mat1)/n)
>??? ??? res5<- mat1[j4,]*mat1[j4-1,]*mat1[j4-2,]*mat1[j4-3,]
>??? ? })
>
># user? system elapsed
>#? 0.004?? 0.000?? 0.004
>
>?dimnames(res2)<- dimnames(res5)
>identical(res2,res5)
>#[1] TRUE
>
>
>#if
>n<-6
>?nrow(mat1)%%6
>#[1] 4
>
>
>system.time({
>?mat2<-mat1[seq(nrow(mat1)-4),]
>j6<- n*seq_len(nrow(mat2)/n)
>?res6<-
mat2[j6,]*mat2[j6-1,]*mat2[j6-2,]*mat2[j6-3,]*mat2[j6-4,]*mat2[j6-5,]
>res6New<-rbind(res6,apply(tail(mat1,4),2,prod)
>)})
>
>#? user? system elapsed
>?# 0.004?? 0.000?? 0.006
>
>
>
>system.time({res6Alt<-
>t(sapply(split(as.data.frame(mat1),as.numeric(gl(nrow(mat1),n,nrow(mat1)))),function(x)
Reduce("*",as.data.frame(t(x))))) })
>#user? system elapsed
>?# 5.576?? 0.000?? 5.583
>dimnames(res6Alt)<- dimnames(res6New)
>
>
>all.equal(res6New,res6Alt)
>#[1] TRUE
>
>
>A.K.
>
>
>
>As you said, this is very loooong.
>Do you have a better solution on big data ?
>
>
>
>----- Original Message -----
>From: arun <smartpink111 at yahoo.com>
>To: Edouard Hardy <hardy.edouard at gmail.com>
>Cc: R help <r-help at r-project.org>; Bert Gunter <gunter.berton at
gene.com>
>Sent: Monday, September 2, 2013 12:07 PM
>Subject: Re: [R] Product of certain rows in a matrix
>
>
>
>Hi,
>No problem.
>n<- 4
>
>t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),function(x)
apply(x,2,prod)))?
>
>#? V1? V2?? V3
>#1 252 640 1134
>#2? 18? 30?? 20
>
>
>This could be a bit slow if you have big dataset.
>
>
>A.K.
>
>
>
>________________________________
>From: Edouard Hardy <hardy.edouard at gmail.com>
>To: arun <smartpink111 at yahoo.com>
>Cc: R help <r-help at r-project.org>
>Sent: Monday, September 2, 2013 11:58 AM
>Subject: Re: [R] Product of certain rows in a matrix
>
>
>
>Thank you A.K.
>And do you have a solution without installing any package ?
>Thank you in advance.
>E.H.
>
>
>
>Edouard Hardy
>
>
>
>On Mon, Sep 2, 2013 at 5:56 PM, arun <smartpink111 at yahoo.com>
wrote:
>
>
>>
>>HI,
>>In my first solutions:
>>?n<-3
>>?t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),colProds))
>>#? [,1] [,2] [,3]
>>#1?? 28?? 80? 162
>>#2? 162?? 80?? 28
>>#3??? 1??? 3??? 5
>>?n<-4
>>?t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),n,nrow(Anew)))),colProds))
>>#? [,1] [,2] [,3]
>>#1? 252? 640 1134
>>#2?? 18?? 30?? 20
>>
>>A.K.
>>
>>________________________________
>>From: Edouard Hardy <hardy.edouard at gmail.com>
>>To: arun <smartpink111 at yahoo.com>
>>Cc: Bert Gunter <gunter.berton at gene.com>; R help <r-help at
r-project.org>
>>Sent: Monday, September 2, 2013 11:46 AM
>>
>>Subject: Re: [R] Product of certain rows in a matrix
>>
>>
>>
>>Thank you all for your responses.
>>The real problem is that all your answer work for products 2 by 2.
>>I now have to do the product n by n row.
>>Do you have a solution ?
>>Thank you in advance,
>>E.H.?
>>
>>
>>
>>Edouard Hardy
>>
>>
>>
>>On Mon, Sep 2, 2013 at 5:43 PM, arun <smartpink111 at yahoo.com>
wrote:
>>
>>I guess in such situations,
>>>
>>>
>>>fun1<- function(mat){
>>>?if(nrow(mat)%%2==0){
>>>?j<- 2*seq_len(nrow(mat)/2)
>>>?b<- mat[j,]* mat[j-1,]
>>>?}
>>>?else {mat1<- mat[-nrow(mat),]
>>>?j<- 2*seq_len(nrow(mat1)/2)
>>>?b<- rbind(mat1[j,]*mat1[j-1,],mat[nrow(mat),])
>>>? }
>>>b
>>>}
>>>fun1(A)
>>>#???? [,1] [,2] [,3]
>>>
>>>#[1,]??? 4?? 10?? 18
>>>#[2,]?? 63?? 64?? 63
>>>#[3,]?? 18?? 10??? 4
>>>?fun1(Anew)
>>>#???? [,1] [,2] [,3]
>>>
>>>#[1,]??? 4?? 10?? 18
>>>#[2,]?? 63?? 64?? 63
>>>#[3,]?? 18?? 10??? 4
>>>#[4,]??? 1??? 3??? 5
>>>
>>>
>>>A.K.
>>>
>>>
>>>
>>>
>>>----- Original Message -----
>>>From: arun <smartpink111 at yahoo.com>
>>>To: Bert Gunter <gunter.berton at gene.com>
>>>Cc: R help <r-help at r-project.org>
>>>
>>>Sent: Monday, September 2, 2013 11:26 AM
>>>Subject: Re: [R] Product of certain rows in a matrix
>>>
>>>Hi Bert,
>>>Thanks.? It is a better solution.
>>>
>>>If nrow() is not even.
>>>
>>>Anew<- rbind(A,c(1,3,5))
>>>j<-seq_len(nrow(Anew)/2)###
>>>?Anew[j,]*Anew[j-1,]
>>>#Error in Anew[j, ] * Anew[j - 1, ] : non-conformable arrays
>>>
>>>t(sapply(split(as.data.frame(Anew),as.numeric(gl(nrow(Anew),2,7))),colProds))
>>>? [,1] [,2] [,3]
>>>1??? 4?? 10?? 18
>>>2?? 63?? 64?? 63
>>>3?? 18?? 10??? 4
>>>4??? 1??? 3??? 5
>>>
>>>A.K.
>>>
>>>
>>>
>>>
>>>
>>>
>>>________________________________
>>>From: Bert Gunter <gunter.berton at gene.com>
>>>To: arun <smartpink111 at yahoo.com>
>>>Cc: R help <r-help at r-project.org>
>>>Sent: Monday, September 2, 2013 10:55 AM
>>>Subject: Re: [R] Product of certain rows in a matrix
>>>
>>>
>>>
>>>These elaborate manipulations are unnecessary and inefficient. Use
indexing instead:
>>>
>>>j <- 2*seq_len(nrow(A)/2)
>>>b <- A[j,]*A[j-1,]
>>>b
>>>[,1] [,2] [,3]
>>>[1,]??? 4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10??? 4
>>>
>>>[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4
>>>[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4
>>>[,1] [,2] [,3]
>>>[1,]????4?? 10?? 18
>>>[2,]?? 63?? 64?? 63
>>>[3,]?? 18?? 10????4
>>>
>>>
>>>
>>>
>>>
>>>On Mon, Sep 2, 2013 at 7:25 AM, arun <smartpink111 at
yahoo.com> wrote:
>>>
>>>Hi,
>>>>You could try:
>>>>
>>>>A<- matrix(unlist(read.table(text="
>>>>1 2 3
>>>>4 5 6
>>>>7 8 9
>>>>9 8 7
>>>>6 5 4
>>>>3 2 1
>>>>",sep="",header=FALSE)),ncol=3,byrow=FALSE,dimnames=NULL)
>>>>
>>>>library(matrixStats)
>>>>?res1<-t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),colProds))
>>>>?res1
>>>>#? [,1] [,2] [,3]
>>>>#1??? 4?? 10?? 18
>>>>#2?? 63?? 64?? 63
>>>>#3?? 18?? 10??? 4
>>>>
>>>>
>>>>?res2<-t(sapply(split(as.data.frame(A),((seq_len(nrow(A))-1)%/%2)+1),colProds))
>>>>?identical(res1,res2)
>>>>#[1] TRUE
>>>>
>>>>#or
>>>>?t(sapply(split(as.data.frame(A),as.numeric(gl(nrow(A),2,6))),function(x)
apply(x,2,prod)))
>>>>
>>>>#or
>>>>library(plyr)
>>>>?as.matrix(ddply(as.data.frame(A),.(as.numeric(gl(nrow(A),2,6))),colProds)[,-1])
>>>>#???? V1 V2 V3
>>>>#[1,]? 4 10 18
>>>>#[2,] 63 64 63
>>>>#[3,] 18 10? 4
>>>>
>>>>#or
>>>>do.call(rbind,tapply(seq_len(nrow(A)),list(as.numeric(gl(nrow(A),2,6))),FUN=function(x)
colProds(A[x,])))
>>>>#or
>>>>A1<- data.frame(A,ID=as.numeric(gl(nrow(At),2,6)))
>>>>?aggregate(A1[,-4],list(A1[,4]),colProds)[,-1]
>>>>#? X1 X2 X3
>>>>#1? 4 10 18
>>>>#2 63 64 63
>>>>#3 18 10? 4
>>>>
>>>>#or
>>>>library(data.table)
>>>>At<- data.table(A1,key='ID')
>>>>subset(At[,lapply(.SD,colProds),by=ID],select=-1)
>>>>#?? X1 X2 X3
>>>>#1:? 4 10 18
>>>>#2: 63 64 63
>>>>#3: 18 10? 4
>>>>
>>>>A.K.
>>>>
>>>>
>>>>
>>>>
>>>>Hello,
>>>>
>>>>I have this matrix :
>>>>A >>>>1 2 3
>>>>4 5 6
>>>>7 8 9
>>>>9 8 7
>>>>6 5 4
>>>>3 2 1
>>>>
>>>>I would like to have this matrix (product of rows 2 by 2) :
>>>>A >>>>4 10 18
>>>>63 64 63
>>>>18 10 4
>>>>
>>>>Is it possible to do that without a loop ?
>>>>
>>>>Thank you in advance !
>>>>
>>>>______________________________________________
>>>>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.
>>>>
>>>
>>>
>>>--
>>>
>>>
>>>Bert Gunter
>>>Genentech Nonclinical Biostatistics
>>>
>>>Internal Contact Info:
>>>Phone: 467-7374
>>>Website:
>>>
>>>http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
>>>
>>>______________________________________________
>>>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.
>>>
>>
>