2009-09-08 21 views
10

Tôi có một khung dữ liệu với một số cột, một trong số đó là một yếu tố được gọi là "trang web". Làm thế nào tôi có thể chia khung dữ liệu thành các khối của mỗi hàng với một giá trị duy nhất của "site", và sau đó xử lý từng khối với một hàm? Các dữ liệu giống như thế này:Cách chia khung dữ liệu theo hàng và sau đó xử lý các khối?

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 

và tôi muốn tạo ra một âm mưu của year vs peak cho mỗi trang web.

Trả lời

12

Một lựa chọn khác là sử dụng hàm ddply từ thư viện ggplot2. Nhưng bạn đề cập đến bạn chủ yếu muốn làm một âm mưu của đỉnh so với năm, vì vậy bạn cũng có thể chỉ cần sử dụng 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

Mặt khác, tôi làm như giải pháp David Smith cho phép áp dụng hàm để chạy trên một số bộ xử lý.

14

Bạn có thể sử dụng isplit (từ gói "lặp") để tạo ra một đối tượng iterator mà vòng qua các khối được định nghĩa bởi site cột:

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

Sau đó, bạn có thể sử dụng foreach (từ "foreach" gói) để tạo ra một âm mưu trong mỗi khối:

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() 
} 

Như một phần thưởng, nếu bạn có một máy đa xử và gọi registerDoMC() đầu tiên (từ gói "doMC"), các vòng sẽ chạy song song, SPE chỉnh sửa mọi thứ. Chi tiết khác trong bài đăng trên blog về Cuộc cách mạng này: Block-processing a data frame with isplit

4

Có hai chức năng được tích hợp sẵn để xử lý các loại tình huống này. ? tổng hợp và? bởi. Trong trường hợp này bởi vì bạn muốn có một cốt truyện và không được trả lại một vô hướng, sử dụng bằng()

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

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

Sản lượng nói NULL vì đó là những gì lợi nhuận cốt truyện. Bạn có thể muốn đặt thiết bị đồ họa thành pdf để chụp tất cả đầu ra.

6

Đây là những gì tôi sẽ làm, mặc dù có vẻ như các bạn đã xử lý các chức năng thư viện.

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

Loại mã này trực tiếp hơn và có thể kém hiệu quả hơn, nhưng tôi thích đọc những gì nó đang làm hơn là tìm hiểu một số chức năng thư viện mới cho cùng một thứ. làm cho điều này cảm thấy linh hoạt hơn, nhưng trong tất cả sự trung thực này chỉ là cách tôi figured nó ra như là một người mới.

+1

Karl, tôi đồng ý rằng điều này có thể đọc được. Nhưng mã để vẽ ('doSomething') sẽ ít hơn nhiều. Giải pháp tốt cho một vấn đề khác. – isomorphismes

10

Tôi dường như nhớ lại rằng đồng bằng cũ split() có một phương thức cho data.frames, để split(data,data$site) sẽ tạo danh sách các khối. Sau đó, bạn có thể hoạt động trên danh sách này bằng cách sử dụng sapply/lapply/for.

split() cũng đẹp vì unsplit(), sẽ tạo ra một vectơ có độ dài bằng với dữ liệu gốc và theo đúng thứ tự.

2

Nó cũng rất dễ dàng để tạo ra âm mưu của bạn với các gói mạng:

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

Bạn có thể sử dụng split chức năng Nếu bạn mở dữ liệu của bạn như:

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

Sau đó, khối chứa dữ liệu từ mỗi khối mà bạn có thể truy cập dưới dạng dữ liệu khác.frame:

plot(blocks$ALBEN$year, blocks$ALBEN$peak) 

Và cứ thế cho mỗi ô.

Các vấn đề liên quan