2015-06-17 27 views
8

Tamam, bu kolay olmalı, ancak olabildiğince hızlı bir çözüm arıyorum.Tabloların farklı uzunlukları varsa, birkaç tablodaki sütun değerlerini nasıl toplarım?

> tab1 
1 2 3 
3 2 3 
> tab2 
1 4 
2 3 
> tab3 
1 2 3 5 
2 1 1 1 

Ben hızlı bir şekilde olmasını istiyorsanız Ne:

tab1 <- table(c(1, 1, 1, 2, 2, 3, 3, 3)) 
tab2 <- table(c(1, 1, 4, 4, 4)) 
tab3 <- table(c(1, 1, 2, 3, 5)) 

Bu ne olsun:

en 3 tablolar (tablo sayısı çok daha büyük olacaktır) var diyelim birçok büyük tablolar ile çalışır, böylece şudur: Yani

1 2 3 4 5 
7 3 4 3 1 

temelde tablolar herüzerinde toplanabilir. Kaybettiğim bir temel işlev var mı? Yardım ettiğin için teşekkür ederim!

+4

Vektörlerinizin birleştirilmesi ve "süper" vektörde "tablo" olarak adlandırılması hakkında ne dersiniz? – Cath

+0

Bu işe yarayacaktı. Ancak, tablolar ('tab1',' tab2' ...) önceden üretildi ve ben hesaplamalara giren tablo kümesini değiştirmek istiyorum. Bu tabloların temeli olan orijinal vektörler artık mevcut değildir. – swolf

cevap

12

Biz 'v1' oluşturmak için (c) tab çıkışını bitiştirmek deneyebilirsiniz.

v1 <- c(tab1, tab2, tab3) 
tapply(v1, names(v1), FUN=sum) 
#1 2 3 4 5 
#7 3 4 3 1 
+1

çok güzel bir çözüm – Rentrop

+0

@ Floo0 Geri bildirim için teşekkürler – akrun

+1

Teşekkürler! Tapply, zarif bir çözüm gibi görünüyor. Ve oldukça hızlı görünüyor. Mamoun Benghezal'ın çözümünü kesinlikle geride bırakıyor. 'rbenchmark' bana 5 kat daha hızlı olduğunu söylüyor. – swolf

1

için söz konusu nesnenin names göre gruplandırılmış elemanların sum almak için tapply kullanın bu

df <- rbind(as.matrix(tab1), as.matrix(tab2), as.matrix(tab3)) 
aggregate(df, by=list(row.names(df)), FUN=sum) 
    Group.1 V1 
1  1 7 
2  2 3 
3  3 4 
4  4 3 
5  5 1 
+0

Teşekkürler Mamoun, çok daha hızlı görünüyor ki 'tapply' çözümüyle gideceğim. – swolf

5

rowsum(). Çıktı, gösterdiğinizden biraz farklı olacak, ancak hesaplamalardan sonra her zaman yeniden yapılandırabilirsiniz. rowsum()'un çok verimli olduğu bilinmektedir.

x <- c(tab1, tab2, tab3) 
rowsum(x, names(x)) 
# [,1] 
# 1 7 
# 2 3 
# 3 4 
# 4 3 
# 5 1 

Burada hem katma akrun en data.table öneriyle bir kriter var.

library(microbenchmark) 
library(data.table) 

xx <- rep(x, 1e5) 

microbenchmark(
    tapply = tapply(xx, names(xx), FUN=sum), 
    rowsum = rowsum(xx, names(xx)), 
    data.table = data.table(xx, names(xx))[, sum(xx), by = V2] 
) 
# Unit: milliseconds 
#  expr  min  lq  mean median  uq  max neval 
#  tapply 150.47532 154.80200 176.22410 159.02577 204.22043 233.34346 100 
#  rowsum 41.28635 41.65162 51.85777 43.33885 45.43370 109.91777 100 
# data.table 21.39438 24.73580 35.53500 27.56778 31.93182 92.74386 100 
İlgili konular