2009-09-08 18 views
10

Birden çok sütun içeren bir veri çerçevem ​​var; bunlardan biri "site" adında bir faktör. Veri çerçevesini, her biri benzersiz bir "site" değeri olan satır bloklarına bölebilir ve ardından her bloğu bir işlevle işleyebilir miyim? verileri bu gibi görünebilir:Veri çerçevesini satırlara bölme ve sonra blokları işleme?

site year peak 
ALBEN 5 101529.6 
ALBEN 10 117483.4 
ALBEN 20 132960.9 
ALBEN 50 153251.2 
ALBEN 100 168647.8 
ALBEN 200 184153.6 
ALBEN 500 204866.5 
ALDER 5 6561.3 
ALDER 10 7897.1 
ALDER 20 9208.1 
ALDER 50 10949.3 
ALDER 100 12287.6 
ALDER 200 13650.2 
ALDER 500 15493.6 
AMERI 5 43656.5 
AMERI 10 51475.3 
AMERI 20 58854.4 
AMERI 50 68233.3 
AMERI 100 75135.9 
AMERI 200 81908.3 

ve ben her bir site için peak vs year bir arsa oluşturmak istiyorum.

require(iterators) 
site.data <- read.table("isplit-data.txt",header=T) 
sites <- isplit(site.data,site.data$site) 

Sonra "foreach" dan (foreach kullanabilirsiniz:

cevap

12

Başka bir seçenek,işlevini ggplot2 kitaplığından kullanmanızdır. Ama çoğunlukla yılın vs tepe bir arsa yapmak istiyorum söz, bu nedenle de sadece qplot kullanabilirsiniz:

A <- read.table("example.txt",header=TRUE) 
library(ggplot2) 
qplot(peak,year,data=A,colour=site,geom="line",group=site) 
ggsave("peak-year-comparison.png") 
Öte yandan

alt text http://i32.tinypic.com/16nuza.png

, David Smith'in çözüm gibi yapmak verir Birkaç işlemci arasında çalıştırılacak işlevin uygulanması.

14

Sen site sütuna göre belirlenen bloklar üzerinde döngüler bir yineleyici nesnesi oluşturmak için ("yineleyiciler" paketinden) isplit kullanabilirsiniz paket) her biri içerisinden bir arsa oluşturmak için: bir çok işlemcili makine var ve "doMC" paketinden (ilk registerDoMC() ararsanız döngüler paralel olarak çalışır,), bir bonus olarak

require(foreach) 
foreach(site=sites) %dopar% { 
pdf(paste(site$key[[1]],".pdf",sep="")) 
plot(site$value$year,site$value$peak,main=site$key[[1]]) 
dev.off() 
} 

, sPE şeyleri düzenlemek. Bu Devrimdeki blog gönderisindeki daha fazla ayrıntı: Block-processing a data frame with isplit

4

Bu tür durumlarla uğraşmak için iki kullanışlı işlev vardır. ? agrega ve? tarafından. Bu durumda, bir arsa istiyorum çünkü() tarafından bir skalar, kullanım döndürmediğinden

data <- read.table("example.txt",header=TRUE)

by(data[, c('year', 'peak')], data$site, plot)

bu ne arsa döner çünkü çıkış NULL söylüyor. Tüm çıkışı yakalamak için grafik aygıtı pdf'ye ayarlamak isteyebilirsiniz.

6

Burada yapmam gereken şey, kütüphane işlevleri tarafından ele alınmış gibi görünüyor. kod

for(i in 1:length(unique(data$site))){ 
    constrainedData = data[data$site==data$site[i]]; 
    doSomething(constrainedData); 
} 

Bu tür daha doğrudan ve daha az verimli olabilir, ama ben aynı şey için bazı yeni kütüphane işlevini öğrenmek olmadığı kadar ne yaptığını okuyabilecek olmayı tercih ederim. bu da kendini daha esnek hissettiriyor, ama bütün dürüstlükte bu sadece bir acemi olarak anladım.

+1

Karl, Bunun okunabilir olduğunu kabul ediyorum. Fakat çizilecek kod ('doSomething') çok daha az olurdu. Farklı bir sorun için iyi bir çözüm imho. – isomorphismes

10

O eski düz split()'un data.frames için bir yöntemi olduğunu hatırlıyorum, böylece split(data,data$site) bir blok listesi üretecektir. Daha sonra bu listede sapply/lapply/for kullanarak çalışabilirsiniz. , orijinal verilerle aynı uzunlukta ve doğru sırada bir vektör oluşturacak olan unsplit() nedeniyle de güzeldir.Bundan sonra

data <- read.table('your_data.txt', header=T) 
blocks <- split(data, data$site) 

, bloklar: Eğer gibi verilerinizi açarsa

library(lattice) 
xyplot(year~peak | site, data) 
2

O kafes paketiyle araziler oluşturmak için de çok kolaydır Her bir veri bloğundan, diğer data.frame olarak erişebileceğiniz verileri içerir:

plot(blocks$ALBEN$year, blocks$ALBEN$peak) 
Her bir arsa için

.

0

Sen split fonksiyonunu kullanabilirsiniz:

İlgili konular