如何找到在另一个指定级别之前发生的因子的级别?

时间:2016-05-23 11:14:23

标签: r loops categorical-data levels

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

carcass_336的第一种情况下我只想要订单 我为豺狗获得了一个值breed_eagles

对于第二个尸体carcass_338,我依次为鬣狗breed_lappetsbreed_eagles提供2个等级。豺狼的3个级别,因为鬣狗到达它之前,即breed_lappetsbreed_eagles& breed_hyena

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

理想情况下,我也想通过使用每个最小got.here来挑选出直接在豺和鬣狗之前发生的等级。例如。对于carcass_338,它将是breed_eagles的{​​{1}}。再一次,我认为got.here值是有用的,因为我已经用它来为每个屠体提取最短的到达时间用于另一个目的:

breed_hyenas

这是我的数据:

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")

1 个答案:

答案 0 :(得分: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]])})

这将返回一个矩阵,其中包含每个品种的计数,包括鬣狗和豺狼。现在,我们从计数中删除鬣狗和豺,并将胴体名称添加到列中:

# 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])