我怎样才能找到在另一个指定水平之前出现的因素水平?
How can I find the levels of a factor that occurs before another specified level?
我有关于物种到达食物的时间的数据。我希望能够通过使用 got.here
值(即它们的到达时间)来确定每个尸体在 breed_jackals
和 breed_hyena
水平之前发生的 breed
水平。
我只想要第一种情况下的顺序 carcass_336
我会为豺狼取一个值,即 breed_eagles
。
对于第二具尸体 carcass_338
我有 2 个级别的鬣狗 breed_lappets
和 breed_eagles
的顺序。豺狼有 3 个级别,因为鬣狗先于它到达,即 breed_lappets
、breed_eagles
和 breed_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])
我有关于物种到达食物的时间的数据。我希望能够通过使用 got.here
值(即它们的到达时间)来确定每个尸体在 breed_jackals
和 breed_hyena
水平之前发生的 breed
水平。
我只想要第一种情况下的顺序 carcass_336
我会为豺狼取一个值,即 breed_eagles
。
对于第二具尸体 carcass_338
我有 2 个级别的鬣狗 breed_lappets
和 breed_eagles
的顺序。豺狼有 3 个级别,因为鬣狗先于它到达,即 breed_lappets
、breed_eagles
和 breed_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])