我有关于不同熊的时间数据("ID"),在不同的位置("Position";陆地或冰)。下面是两个个体(A和B)的简化版本:
ID <- rep.int(c("A", "B"), times = c(10, 10))
Dates <- c(seq(as.Date("2011-06-11"), as.Date("2011-06-20"), by = "days"),
seq(as.Date("2011-05-27"), as.Date("2011-06-05"), by="days"))
Position <- c("Land", "Ice", "Land", "Land", "Ice", "Ice", "Land", "Land", "Land", "Land",
"Land", "Land", "Land", "Ice", "Ice", "Land", "Land", "Land", "Ice", "Ice")
data <- data.frame(ID, Dates, Position)
ID Dates Position
1 A 2011-06-11 Land
2 A 2011-06-12 Ice
3 A 2011-06-13 Land
4 A 2011-06-14 Land
5 A 2011-06-15 Ice
6 A 2011-06-16 Ice
7 A 2011-06-17 Land
8 A 2011-06-18 Land
9 A 2011-06-19 Land
10 A 2011-06-20 Land
11 B 2011-05-27 Land
12 B 2011-05-28 Land
13 B 2011-05-29 Land
14 B 2011-05-30 Ice
15 B 2011-05-31 Ice
16 B 2011-06-01 Land
17 B 2011-06-02 Land
18 B 2011-06-03 Land
19 B 2011-06-04 Ice
20 B 2011-06-05 Ice
我想创建一个变量Arrival
,它表示每只熊到达陆地的日期。我将到达陆地定义为在"陆地"上连续运行三个Position
的第一行的日期。此行应设置为"到达",其他行应设置为NA
。此日期也必须发生在5月31日之后。
对于此数据集,到达日期如下所示:
ID Dates Position Arrival
1 A 2011-06-11 Land NA
2 A 2011-06-12 Ice NA
3 A 2011-06-13 Land NA
4 A 2011-06-14 Land NA
5 A 2011-06-15 Ice NA
6 A 2011-06-16 Ice NA
7 A 2011-06-17 Land Arrival
8 A 2011-06-18 Land NA
9 A 2011-06-19 Land NA
10 A 2011-06-20 Land NA
11 B 2011-05-27 Land NA
12 B 2011-05-28 Land NA
13 B 2011-05-29 Land NA
14 B 2011-05-30 Ice NA
15 B 2011-05-31 Ice NA
16 B 2011-06-01 Land Arrival
17 B 2011-06-02 Land NA
18 B 2011-06-03 Land NA
19 B 2011-06-04 Ice NA
20 B 2011-06-05 Ice NA
有没有一种方法可以在R中实现,最好是使用dplyr?
5条答案
按热度按时间ldfqzlk81#
我们可以使用
zoo::rollapply
来完成这个任务。天
带动物园的R基地
mv1qrgav2#
结果
68de4m5k3#
不像其他解决方案那样简洁,而是逐步使用一些临时变量。
bzzcjhmw4#
我希望你的 * 更喜欢使用dplyr * 意味着你仍然对其他可能性持开放态度:)如果是这样,这里有一个
data.table
的替代方案。选择相关行(
Dates > "2011-05-31"
)。按"ID"和"位置"的连续运行创建组(by = .(ID, rleid(Position))
)。在每个组中,if
的行数大于2位置运行中的(.N > 2
)&
值为"Land"
(Position[1] == "Land"
),创建第一个值为"Arrival",其余值(.N-1
)为NA
的结果。通过引用添加新列(:=
)。6ovsh4lw5#
这种
dplyr
方法使用相对(非硬编码)年份作为日期条件。rleid
需要library(data.table)
。可以替换,但非常方便。