2009-09-08 8 views
10

나는 하나의 요소가 "사이트"라는 요소 인 여러 열이있는 데이터 프레임을 가지고 있습니다. 고유 한 값 "site"를 가진 행 블록으로 데이터 프레임을 분할 한 다음 각 블록을 함수로 처리하는 방법은 무엇입니까? 데이터는 다음과 같다 :행별로 데이터 프레임을 분할 한 다음 블록을 처리하는 방법은 무엇입니까?

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 

나는 각 사이트 peakyear의 플롯을 만들려고합니다.

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

그런 다음 당신은 "foreach는"에서 (foreach를 사용할 수 있습니다

답변

12

또 다른 선택은 ggplot2 라이브러리의 ddply 함수를 사용하는 것입니다. 그러나 당신은 당신이 주로 년 대 피크의 플롯을 수행 할 언급, 그래서 당신은 또한 단지 qplot을 사용할 수

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") 
한편

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

, 나는 데이비드 스미스의 솔루션을 같이 할 것을이 수 함수를 여러 프로세서에서 실행되도록 적용

14

당신은 site 열을 기준으로 정의 된 블록을 통해 루프 반복자 객체를 생성 (이하 "반복자"패키지에서) isplit을 사용할 수 있습니다 패키지) 각 블록 내에서 플롯 만들 : 다중 프로세서 기계를 가지고와 "doMC"패키지 (첫번째 registerDoMC()를 호출하는 경우 루프를 병렬로 실행됩니다), 보너스로

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 일들을 편집. 이 혁명 블로그 게시물의 세부 정보 : Block-processing a data frame with isplit

4

이러한 종류의 상황을 처리하기위한 편리한 기능이 두 가지 있습니다. 집계 및? 이 경우 플롯을 원하기 때문에과()에 의해 스칼라, 사용을 반환하지 않습니다

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

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

그 어떤 플롯 수익을 때문에 출력은 NULL 말한다. 그래픽 장치를 pdf로 설정하여 모든 출력을 캡처 할 수 있습니다.

6

여러분이 라이브러리 기능으로 처리 한 것처럼 보이지만 여기에 나와있는 것처럼 할 수 있습니다. 코드의

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

이 종류는보다 직접적이며, 덜 효율적이 될 수도 있지만 나는 같은 일에 대한 몇 가지 새로운 라이브러리 기능을 배우는 것보다이 무엇을하고 있는지 읽을 수있게하는 것을 선호합니다. 이 느낌을 더욱 유연하게 만든다. 그러나 모든 정직함에서 이것은 내가 초보자로 알아 낸 방법 일 뿐이다.

+1

Karl, 나는 이것이 읽기 쉽다는 것에 동의합니다. 그러나 음모를 꾸미는 코드 (doSomething)는 훨씬 적습니다. 다른 문제에 대한 좋은 해결책. – isomorphismes

10

평범한 옛날 split()에는 data.frames에 대한 메소드가 있으므로, split(data,data$site)은 블록 목록을 생성합니다. 그런 다음 sapply/lapply/for을 사용하여이 목록에서 작업 할 수 있습니다.

split()unsplit()이므로 원본 데이터와 길이가 같고 올바른 순서로 벡터가 생성됩니다.그 후

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

, 블록 : 당신은 귀하의 데이터를 연 경우

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

격자 패키지와 플롯을 생성하는 것이 매우 쉽습니다 각 블록에서 다른 데이터로 액세스 할 수있는 데이터가 포함되어 있습니다. 프레임 :

각 줄거리에 대해서도 마찬가지입니다.

0

당신은 split 기능 을 사용할 수

관련 문제