我怎样才能找到在另一个指定水平之前出现的因素水平?

How can I find the levels of a factor that occurs before another specified level?

我有关于物种到达食物的时间的数据。我希望能够通过使用 got.here 值(即它们的到达时间)来确定每个尸体在 breed_jackalsbreed_hyena 水平之前发生的 breed 水平。

我只想要第一种情况下的顺序 carcass_336 我会为豺狼取一个值,即 breed_eagles

对于第二具尸体 carcass_338 我有 2 个级别的鬣狗 breed_lappetsbreed_eagles 的顺序。豺狼有 3 个级别,因为鬣狗先于它到达,即 breed_lappetsbreed_eaglesbreed_hyena.

我认为 arrivals$breed[arrivals$mycarcass=="carcass_336"] 会起作用,但它给了我所有级别。

理想情况下,我还想通过对每个级别使用最小值 got.here 来找出在豺狼和鬣狗之前直接出现的级别。例如。对于 carcass_338 它将是 breed_eagles 对于 breed_hyenas。我认为 got.here 值再次有用,因为我已经使用它来提取每个尸体的最短到达时间用于另一个目的:

arrivals[ arrivals$got.here == ave(arrivals$got.here, arrivals$mycarcass, FUN=min), ]

这是我的数据:

arrivals <-  read.table(header=T, text="
who     breed           got.here   mycarcass
167     breed_eagles    102        carcass_336
183     breed_eagles    108        carcass_336
181     breed_eagles    271        carcass_336
134     breed_eagles    284        carcass_336
191     breed_eagles    311        carcass_336
283     breed_jackals   5419       carcass_336
118     breed_lappets   200        carcass_338
198     breed_eagles    219        carcass_338
151     breed_eagles    256        carcass_338
206     breed_hyenas    1759       carcass_338
294     breed_jackals   7948       carcass_338
235     breed_hyenas    10988      carcass_338
215     breed_hyenas    13629      carcass_338
290     breed_jackals   17013      carcass_338")

我想要的预期输出将由此得出,并且是这些事件发生的频率。例如对于豺狼

 preceeding_breed   frequency
 breed_eagles         1
 breed_lappets        0
 breed_hyenas         1

这是一种在豺到达之前按物种计算到达数量的方法。可能有更清洁的方法。为清楚起见,我只展示豺狼的解决方案,但获得鬣狗的结果将很简单。

# for each carcass, calculate the first jackal arrival
first_jackals <- aggregate(got.here~mycarcass,
                           data=arrivals[arrivals$breed=="breed_jackals",], FUN=min)

# tabulate the number of other animals arriving before the jackal
beat_jackals <- sapply(unique(arrivals$mycarcass), function(i) {
        table(arrivals$breed[arrivals$mycarcass==i & 
              arrivals$got.here < first_jackals$got.here[first_jackals$mycarcass==i]])})

此 returns 矩阵包含每个品种的计数,包括鬣狗和豺。现在,我们从计数中删除鬣狗和豺,并将尸体名称添加到列中:

# drop unwanted breeds
beat_jackals <- 
          beat_jackals[row.names(beatJackals) != "breed_jackals",]
# add carcass names to the columns
colnames(beat_jackals) <- unique(arrivals$mycarcass)

因为 sapply 以相同的顺序处理尸体,unique(arrivals$mycarcass),我们不必担心错位。

要按品种获取每具尸体的到达顺序,您可以使用以下命令:

arrival_order <- sapply(unique(arrivals$mycarcass), function(i) {
                                     unique(arrivals[arrivals$mycarcass==i, "breed"])})

这将使您能够找出在豺狼之前到达的品种:

sapply(arrival_order, function(i) i[(which(i=="breed_jackals"))-1])