0

種 (sp)、日 (POSIXct では日)、および面積 (ar) で構成されるこのデータセット (dat) で、日によって異なる一連の選択を行う必要があります。

sp  day         ar
A   1-Jan-00    2
B   1-Jan-00    6
C   2-Jan-00    2
A   2-Jan-00    1
D   2-Jan-00    4
E   2-Jan-00    12
F   3-Jan-00    8
A   4-Jan-00    3
G   4-Jan-00    2
B   4-Jan-00    1

種「A」が発生する場所をサブセット化する必要があります。ただし、選択されるエリアは、このマトリックス (dat.ar) によって与えられる日によって異なります。

day       ar.select
1-Jan-00    (1,6)
2-Jan-00    (1,12)
3-Jan-00    (4,8)
4-Jan-00    (3,12)

より具体的には、2000 年 1 月 1 日に種「A」が発生する地域については、地域 1 と 6 のみが必要です。例として、この選択に対するこの例の望ましい出力を以下に示します。

sp  day        ar
A   2-Jan-00    1
A   4-Jan-00    3

私はまだ R のセマンティクスを学ぼうとしているので、for ループを取得することにあまり成功していません。これがどこに行くべきだと思うかのスケッチです:

dat1 = with(dat,sapply(day[sp=="A" & dat.ar$day.s[i] ], 
function(x) ar == (ar[sp=="A" & day == x]==dat.ar$ar.select[j]) 
final=dat[rowSums(dat1) > 0, ]

dat で選択する領域を指定して、dat.ar を通過する for ループに適合する必要があると思います。しかし、for ループを取得しようとする努力にもかかわらず、私はどこにも到達していません。sapply と for ループを組み合わせることが正しい方法であるかどうかもわかりません。誰かが問題を再現したい場合:

sp=c("A","B","C","A","D","E","F","A","G","B")
day=c("1-Jan-00", "1-Jan-00", "2-Jan-00", "2-Jan-00", "2-Jan-00", 
"2-Jan-00", "3-Jan-00", "4-Jan-00", "4-Jan-00", "4-Jan-00")
day=as.POSIXct(day, format="%d-%b-%y")
ar=c(2,6,2,1,4,12,8,3,2,1)
dat= as.data.frame(cbind(sp, day, ar)) 

day.s=c("1-Jan-00", "2-Jan-00", "3-Jan-00", "4-jan-00")
day.s=as.POSIXct(day.s, format="%d-%b-%y")
a.s=c(1,1,4,3)
a.e=c(6,12,8,12)
ar.select=paste(a.s, a.e, sep=",")
dat.ar=cbind(day.s, ar.select)

どんな助けでも大歓迎です。

4

2 に答える 2

2

まず、私はas.data.frame(cbind(...))あなたdata.frameの s を作るために使用しません。第二に、あなたが作成dat.arしたのとほぼ同じ構造で作成しdatます。第三に、merge探している結果を得るために使用します。

dat <- data.frame(sp=c("A","B","C","A","D","E","F","A","G","B"),
                  day=c("1-Jan-00", "1-Jan-00", "2-Jan-00", "2-Jan-00", 
                        "2-Jan-00", "2-Jan-00", "3-Jan-00", "4-Jan-00", 
                        "4-Jan-00", "4-Jan-00"),
                  ar=c(2,6,2,1,4,12,8,3,2,1))
dat$day <- as.POSIXct(dat$day, format="%d-%b-%y")

day.s <- c("1-Jan-00", "2-Jan-00", "3-Jan-00", "4-jan-00")
day.s <- as.POSIXct(day.s, format="%d-%b-%y")
a.s <- c(1,1,4,3)
a.e <- c(6,12,8,12)
ar.select <- paste(a.s, a.e, sep=",")
dat.ar <- data.frame(sp = "A", day = day.s, ar = ar.select)

dat.ar <- cbind(dat.ar[-3], 
                read.csv(text = as.character(dat.ar$ar), header = FALSE))
library(reshape2)
dat.ar <- melt(dat.ar, id.vars=1:2, value.name="ar")
dat.ar
#   sp        day variable ar
# 1  A 2000-01-01       V1  1
# 2  A 2000-01-02       V1  1
# 3  A 2000-01-03       V1  4
# 4  A 2000-01-04       V1  3
# 5  A 2000-01-01       V2  6
# 6  A 2000-01-02       V2 12
# 7  A 2000-01-03       V2  8
# 8  A 2000-01-04       V2 12

merge(dat, dat.ar)
#   sp        day ar variable
# 1  A 2000-01-02  1       V1
# 2  A 2000-01-04  3       V1

もちろん、dat.ar最初はより親しみやすい方法でオブジェクトを作成することをお勧めします。とにかく後でそれらを分離するつもりなら、なぜ値を一緒に貼り付けるのですか? ;)

dat.ar <- data.frame(sp = "A", 
                     day = c("1-Jan-00", "2-Jan-00", "3-Jan-00", "4-jan-00"),
                     a.s = c(1,1,4,3), a.e = c(6,12,8,12))
dat.ar$day <- as.POSIXct(dat.ar$day, format="%d-%b-%y")

library(reshape2)
dat.ar <- melt(dat.ar, id.vars=1:2, value.name="ar")
于 2013-09-26T19:25:58.570 に答える