【问题标题】:How can I find the levels of a factor that occurs before another specified level?如何找到在另一个指定水平之前出现的因子水平?
【发布时间】:2016-05-23 11:14:22
【问题描述】:

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

我只想要订单,所以在第一种情况下为carcass_336 我会为豺狼得到一个值,即breed_eagles

对于第二个尸体carcass_338,我将按顺序为鬣狗breed_lappetsbreed_eagles 设置2 个级别。豺狼有 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

【问题讨论】:

  • 你能显示预期的输出吗?
  • @mtoto 对这些发生频率的一些总结将是理想的,因为我在回答中没有说明。

标签: r loops categorical-data levels


【解决方案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])

【讨论】:

  • 很棒的答案。非常感谢。一件事是胴体名称没有正确重新分配。不过对我来说不是问题。
  • @ManassaMauler 如果这个答案对你有用,可以通过单击它旁边的复选标记来选择它。如果您有相关问题,可以发布它,我很乐意在有机会时查看。
猜你喜欢
  • 2020-11-13
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2021-02-21
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多