2012-06-13 17 views
9

Aşağıdaki gibi bir veri çerçevem ​​var (206 satır 49 cols). Her bir satırın benzersiz bir adı (ID) vardır, her bir ID 3 kolonda 3 tekrar okumalıdır (örn. D15C D15C.1 D15C.2). Colnames'in ilk 4 harfi ("D15C") grup adlarıdır. Sütunların grup isimleriyle (örneğin D15C, D15C.1 ve D15.2'yi almak için D15C) ortalamasını almam gerekir, böylece son tablo 49 sütundan 16 sütuna birleştirilecektir.R satır, gruplara (veya benzersiz kimliklere) göre birden çok sütun üzerinde demektir

  ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2 
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52 
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76 
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47 
(… 20000 rows)            

I değiştirmiş olduğu ve agrega kullanmak için aşağıdaki veriler çerçevesine düzenlendi:

 ID 1367452_at 1367453_at 1367454_at ... ... 
1 D04C  11.11  9.65  10.19 
2 D04C  10.93  9.94  10.36 
3 D08H  11.85  9.78  9.68 
4 D08H  10.94  9.68  10.07 
5 D08H  10.87  9.67  10.08 
6 D15C  10.73  9.86  10.35 
7 D15C  10.62  9.71  10.26 
8 D15C  10.85  9.82  10.32 
9 D15L  10.73  9.74  10.27 
10 D15L  10.77  9.71  10.19 
11 D15L  10.52  9.76  10.47 

Ancak aşağıdaki agrega ("agg" veri çerçevesi adı) tamamlamak için, 370 saniye sürdü . Sorun

agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T) 

Bu yüzden bir data.table onu dönüştürülür ve bir veri tablosu yöntemini çalıştırmak ...... Ben bekleyen tablolar bu tür 100'ün olması. neyin yanlış olduğunu emin değil

Error: cannot allocate vector of size 144 Kb 
In addition: Warning messages: 
1: Reached total allocation of 1535Mb: see help(memory.size) 
2: Reached total allocation of 1535Mb: see help(memory.size) 

:

dt <- as.data.table(agg) 
setkey(dt, ID) 
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

ama

birkaç dakika sonra bir hata mesajı aldım. Dt [1: 5,1: 5] dt'nin "head" bölümünü görmek için kullanamazsınız ve head (dt), "head" ı göremediğim çatıdan geçen çok fazla satır döndürür. Şimdi ne yapacağımı bilmiyorum.

ID'leri bir sütunda (data.frame'deki gibi) listeleyebilir veya tabloyu transpoze edebilir ve kimlikleri ilk satırda listeleyebilir (data.table'da olduğu gibi). Her iki durumda da, verileri toplamak için daha hızlı bir yol var mı? Çok müteşekkirim!

+0

İlk soru eh? Hoşgeldiniz. 'Data.table' paketindeki gibi gerçekten data.table demek istiyor musunuz? Eğer 'transpose' ve 'aggregate' denediyseniz, o zaman size yardımcı olabilecek tam komutları sağlamak en iyisidir. 'Data.table yöntemi' ile ne kastettiğiniz hakkında bir fikriniz yok. Yığın Taşması konusunda iyi sorular sormak için bazı kurallar var (ama onları hızlıca yapamam). Tavsiye istemek için R sohbet odasını deneyin. –

+0

Üzgünüm, net değildi. Daha fazla ayrıntı sağlamak için onu düzenledim. Umarım şimdi daha anlaşılabilir. – user1444754

+0

Çok daha iyi, teşekkürler. Bu cevap vermeyi çok hızlı yaptı. –

cevap

12

Bu:

dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

sadece olmalıdır:

dt2 <- dt[, lapply(.SD,mean), by=ID] 

dt[2:ncol(dt)]

satırların bir alt kümesini alarak aslında oldu.

data.table sözdizimini öğrenmenin hızlı bir yolu, isteminde example(data.table) numaralı telefonu çalıştırmak ve komut istemindeki örneklerde çalışmaktır. Bunu "# sütunlara gruplara göre uygulama" için arıyorsanız, tam olarak bu örneği bulacaksınız.

Ve .SD öğrenmek için en iyi yolu dize ".SD" için ?data.table aramak ve daha sonra da bir arama tarafından döndürülen bu data.table etiketinde .SD hakkında bazı iyi sorular ve çok detaylı cevaplar [" data.table vardır ] .SD".

+0

Teşekkürler Matthew. Kodun güzel çalıştı. Daha yeni .SD'yi incelemeye başladım ve bu sabah örnekleri yönetmeye başladım. Bu arada, verileri ilk satırdaki grup (yani ID) ile işlemek için herhangi bir yol var mı (diğer bir deyişle aktarılan tablo)?Sormamın sebebi, R'nin daha uzun [30.000, 3.000], daha geniş [3.000, 30.000], daha iyi değil, daha iyi işlediği görünüyor. örneğin, uzun, ancak aynı büyüklükte aktarılan geniş tabloyu kaydetmek için 5 dakika yazmak için 1 saniye sürer. Bu yüzden, her zaman kaydetmeden önce tabloyu transpoze etmeliyim ve masayı çalıştırmadan önce transpoze etmeliyim. Bu "benim" benzersiz sorun mu? – user1444754

+1

@ user1444754 Sevindim şimdi çalışıyor. Cevabım için oy vermeyi ve kabul etmeyi unutmayın (lütfen). Böylece diğerleri çözüldüğünü biliyorlar. Bu yoruma yeni bir soru için uygun geliyor. Yanıtlayıcı, ne demek istediğinizi hızlı bir şekilde görmek için taze bir R oturumu içine yapıştırabileceğiniz, tekrarlanabilir bir örnek sunmak için en iyisidir. –

İlgili konular