10

いくつかの列を持つデータ フレームがあり、そのうちの 1 つは「サイト」と呼ばれる要素です。データ フレームを「サイト」という一意の値を持つ行のブロックに分割し、各ブロックを関数で処理するにはどうすればよいですか? データは次のようになります。

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

各サイトのyearvsのプロットを作成したいと思います。peak

4

7 に答える 7

14

isplit(「イテレータ」パッケージから) を使用して、列で定義されたブロックをループするイテレータ オブジェクトを作成できますsite

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

次にforeach、(「foreach」パッケージから) を使用して、各ブロック内にプロットを作成できます。

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

おまけとして、マルチプロセッサ マシンがあり、registerDoMC()最初に (「doMC」パッケージから) 呼び出すと、ループが並列に実行され、速度が向上します。詳細については、Revolutions のブログ記事を参照してください: isplit を使用したデータ フレームのブロック処理

于 2009-09-08T17:29:18.547 に答える
12

もう1つの選択肢は、ライブラリのddply関数を使用することです。ggplot2しかし、あなたは主にピーク対年のプロットをしたいと言っているので、あなたはただ使うこともできます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")

代替テキスト

一方、関数の適用を複数のプロセッサで実行できるようにするDavidSmithのソリューションは気に入っています。

于 2009-09-08T17:41:31.593 に答える
10

普通の古いsplit()ものにはdata.framesのメソッドがあるためsplit(data,data$site)、ブロックのリストが生成されることを思い出したようです。sapply/ lapply/を使用して、このリストを操作できますfor

split()これはunsplit()、元のデータと同じ長さのベクトルを正しい順序で作成します。

于 2009-09-09T21:06:07.390 に答える
6

ライブラリ関数で処理しているように見えますが、これが私が行うことです。

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

この種のコードはより直接的であり、効率が悪いかもしれませんが、同じことのために新しいライブラリ関数を学ぶよりも、コードが何をしているのかを読むことができる方が好きです。これもより柔軟に感じさせますが、正直なところ、これは私が初心者として理解した方法です。

于 2009-09-08T19:11:42.317 に答える
4

この種の状況に対処するための便利な組み込み関数が 2 つあります。?aggregate および ?by. この場合、プロットが必要でスカラーを返さないため、 by() を使用します

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

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

出力はNULL、それが plot が返すものであるためです。グラフィックス デバイスを pdf に設定して、すべての出力をキャプチャすることができます。

于 2009-09-08T19:05:00.427 に答える
2

また、lattice パッケージを使用してプロットを生成するのも非常に簡単です。

library(lattice)
xyplot(year~peak | site, data)
于 2012-07-04T14:01:02.443 に答える
0

splitデータを次のように開いた場合、関数を使用できます。

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

その後、ブロックには、他の data.frame としてアクセスできる各ブロックからのデータが含まれます。

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

など、各プロットについて。

于 2013-11-05T18:07:54.503 に答える