Dimitri Liakhovitski
2013-Mar-25 21:00 UTC
[R] Faster way of summing values up based on expand.grid
Hello!
# I have 3 vectors of values:
values1<-rnorm(10)
values2<-rnorm(10)
values3<-rnorm(10)
# In real life, all 3 vectors have a length of 25
# I create all possible combinations of 4 based on 10 elements:
mycombos<-expand.grid(1:10,1:10,1:10,1:10)
dim(mycombos)
# Removing rows that contain pairs of identical values in any 2 of
these columns:
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var2),]
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var3),]
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var4),]
mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var3),]
mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var4),]
mycombos<-mycombos[!(mycombos$Var3 == mycombos$Var4),]
dim(mycombos)
# I want to write sums of elements from values1, values2, and values 3
whose numbers are contained in each column of mycombos. Here is how I am
going it now - using a loop:
mycombos$sum1<-NA
mycombos$sum2<-NA
mycombos$sum3<-NA
for(i in 1:nrow(mycombos)){
mycombos$sum1[i]<-values1[[mycombos[i,"Var1"]]] +
values1[[mycombos[i,"Var2"]]] +
values1[[mycombos[i,"Var3"]]] +
values1[[mycombos[i,"Var4"]]]
mycombos$sum2[i]<-values2[[mycombos[i,"Var1"]]] +
values2[[mycombos[i,"Var2"]]] +
values2[[mycombos[i,"Var3"]]] +
values2[[mycombos[i,"Var4"]]]
mycombos$sum3[i]<-values3[[mycombos[i,"Var1"]]] +
values3[[mycombos[i,"Var2"]]] +
values3[[mycombos[i,"Var3"]]] +
values3[[mycombos[i,"Var4"]]]
}
head(mycombos);tail(mycombos)
# It's going to take me forever with this loop. Is there a faster way of
doing the dame thing? Thanks a lot!
--
Dimitri Liakhovitski
[[alternative HTML version deleted]]
Dimitri Liakhovitski
2013-Mar-25 21:12 UTC
[R] Faster way of summing values up based on expand.grid
This is another method I can think of, but it's also slow:
for(i in 1:nrow(mycombos)){ # i=1
indexes=rep(0,10)
myitems<-unlist(mycombos[i,1:4])
indexes[myitems]<-1
mycombos$sum1[i]<-sum(values1 * indexes)
mycombos$sum2[i]<-sum(values2 * indexes)
mycombos$sum3[i]<-sum(values3 * indexes)
}
On Mon, Mar 25, 2013 at 5:00 PM, Dimitri Liakhovitski <
dimitri.liakhovitski@gmail.com> wrote:
> Hello!
>
> # I have 3 vectors of values:
> values1<-rnorm(10)
> values2<-rnorm(10)
> values3<-rnorm(10)
> # In real life, all 3 vectors have a length of 25
>
> # I create all possible combinations of 4 based on 10 elements:
> mycombos<-expand.grid(1:10,1:10,1:10,1:10)
> dim(mycombos)
> # Removing rows that contain pairs of identical values in any 2 of
> these columns:
> mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var2),]
> mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var3),]
> mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var4),]
> mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var3),]
> mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var4),]
> mycombos<-mycombos[!(mycombos$Var3 == mycombos$Var4),]
> dim(mycombos)
>
> # I want to write sums of elements from values1, values2, and values 3
> whose numbers are contained in each column of mycombos. Here is how I am
> going it now - using a loop:
> mycombos$sum1<-NA
> mycombos$sum2<-NA
> mycombos$sum3<-NA
> for(i in 1:nrow(mycombos)){
> mycombos$sum1[i]<-values1[[mycombos[i,"Var1"]]] +
> values1[[mycombos[i,"Var2"]]] +
values1[[mycombos[i,"Var3"]]] +
> values1[[mycombos[i,"Var4"]]]
> mycombos$sum2[i]<-values2[[mycombos[i,"Var1"]]] +
> values2[[mycombos[i,"Var2"]]] +
values2[[mycombos[i,"Var3"]]] +
> values2[[mycombos[i,"Var4"]]]
> mycombos$sum3[i]<-values3[[mycombos[i,"Var1"]]] +
> values3[[mycombos[i,"Var2"]]] +
values3[[mycombos[i,"Var3"]]] +
> values3[[mycombos[i,"Var4"]]]
> }
> head(mycombos);tail(mycombos)
>
> # It's going to take me forever with this loop. Is there a faster way
of
> doing the dame thing? Thanks a lot!
>
> --
> Dimitri Liakhovitski
>
--
Dimitri Liakhovitski
[[alternative HTML version deleted]]
HI,
You could also try this:
set.seed(25)
values1<-rnorm(10)
values2<-rnorm(10)
values3<-rnorm(10)
mycombos<-expand.grid(1:10,1:10,1:10,1:10)
mycombos1<- mycombos
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var2),]
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var3),]
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var4),]
mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var3),]
mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var4),]
mycombos<-mycombos[!(mycombos$Var3 == mycombos$Var4),]
?dim(mycombos)
#[1] 5040??? 4
#the above steps could be collapsed by:
?mycombos2<-mycombos1[rowSums(sapply(as.data.frame(combn(names(mycombos1),2),stringsAsFactors=FALSE),function(x)
mycombos1[x[1]]!=mycombos1[x[2]]))==6,]
?dim(mycombos2)
#[1] 5040??? 4
?head(mycombos2)
#??? Var1 Var2 Var3 Var4
#124??? 4??? 3??? 2??? 1
#125??? 5??? 3??? 2??? 1
#126??? 6??? 3??? 2??? 1
#127??? 7??? 3??? 2??? 1
#128??? 8??? 3??? 2??? 1
#129??? 9??? 3??? 2??? 1
?identical(mycombos,mycombos2)
#[1] TRUE
sum1<- apply(mycombos,1,function(x) sum(values1[x])) #Jorge's method
sumNew1<-rowSums(sapply(mycombos2,function(x) values1[x]))
?identical(sumNew1,sum1)
#[1] TRUE
system.time(sum1<- apply(mycombos,1,function(x) sum(values1[x])))
#?? user? system elapsed
#? 0.024?? 0.000?? 0.026
?system.time(sumNew1<-rowSums(sapply(mycombos2,function(x) values1[x])))
#?? user? system elapsed
#? 0.012?? 0.000?? 0.010
system.time(sumNew2<-rowSums(sapply(mycombos2,function(x) values2[x])))
system.time(sumNew3<-rowSums(sapply(mycombos2,function(x) values3[x])))
cbind(sumNew1,sumNew2,sumNew3)
A.K.
----- Original Message -----
From: Dimitri Liakhovitski <dimitri.liakhovitski at gmail.com>
To: r-help <r-help at r-project.org>
Cc:
Sent: Monday, March 25, 2013 5:00 PM
Subject: [R] Faster way of summing values up based on expand.grid
Hello!
# I have 3 vectors of values:
values1<-rnorm(10)
values2<-rnorm(10)
values3<-rnorm(10)
# In real life, all 3 vectors have a length of 25
# I create all possible combinations of 4 based on 10 elements:
mycombos<-expand.grid(1:10,1:10,1:10,1:10)
dim(mycombos)
# Removing rows that contain pairs of identical values in any 2 of
these columns:
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var2),]
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var3),]
mycombos<-mycombos[!(mycombos$Var1 == mycombos$Var4),]
mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var3),]
mycombos<-mycombos[!(mycombos$Var2 == mycombos$Var4),]
mycombos<-mycombos[!(mycombos$Var3 == mycombos$Var4),]
dim(mycombos)
# I want to write sums of elements from values1, values2, and values 3
whose numbers are contained in each column of mycombos. Here is how I am
going it now - using a loop:
mycombos$sum1<-NA
mycombos$sum2<-NA
mycombos$sum3<-NA
for(i in 1:nrow(mycombos)){
? mycombos$sum1[i]<-values1[[mycombos[i,"Var1"]]] +
values1[[mycombos[i,"Var2"]]] +
values1[[mycombos[i,"Var3"]]] +
values1[[mycombos[i,"Var4"]]]
? mycombos$sum2[i]<-values2[[mycombos[i,"Var1"]]] +
values2[[mycombos[i,"Var2"]]] +
values2[[mycombos[i,"Var3"]]] +
values2[[mycombos[i,"Var4"]]]
? mycombos$sum3[i]<-values3[[mycombos[i,"Var1"]]] +
values3[[mycombos[i,"Var2"]]] +
values3[[mycombos[i,"Var3"]]] +
values3[[mycombos[i,"Var4"]]]
}
head(mycombos);tail(mycombos)
# It's going to take me forever with this loop. Is there a faster way of
doing the dame thing? Thanks a lot!
--
Dimitri Liakhovitski
??? [[alternative HTML version deleted]]
______________________________________________
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.