0

異なる列の異なる属性に基づいてデータをサブセット化する際に問題があります。これは、種、発見された地域、および時間(すでにPOSIXctにある)を含むダミーデータセットです。

SP Time Area
B 07:22 1
F 09:22 4
A 09:22 1
C 08:17 3
D 09:20 1
E 06:55 4
D 09:03 1
E 09:12 2
F 09:45 1
B 09:15 1

+30 分と -30 分の時間枠内で、SP==A と、同じ地域 (この場合は 1) で発生する他のすべての種を含む行をサブセット化する必要があります。

SP Time Area
A 09:22 1
D 09:20 1
D 09:03 1 
F 09:45 1
B 09:15 1

この 1 時間のウィンドウの条件ステートメントを通過できません。ここで for ループを使用する必要がありますか、それともこれをサブセット化する簡単な方法はありますか? よろしくお願いします。

4

1 に答える 1

2

Aデータが と呼ばれると仮定して、最初の結果だけを 1 つの値で再現するにはdat、次のようにします。

with(dat,dat[
  (
    SP=="A" |
    Area==Area[SP=="A"]
  ) &
  abs(difftime(Time,Time[SP=="A"],units="mins")) <= 30,
]
)

結果:

   SP                Time Area
3   A 2013-09-09 09:22:00    1
5   D 2013-09-09 09:20:00    1
7   D 2013-09-09 09:03:00    1
9   F 2013-09-09 09:45:00    1
10  B 2013-09-09 09:15:00    1

が複数回出現することを考慮するとA、少し複雑になります。

with(dat,dat[
  (
    SP=="A" |
    Area %in% Area[SP=="A"]
  ) & 
  apply(
    sapply(Time[SP=="A"],
    function(x) abs(difftime(Time,x,units="mins"))<=30 ),1,any
  )
,]
)

おそらくどこかで単純化が可能だと確信していますが。

于 2013-09-09T00:31:31.343 に答える