如何在R中为北极熊数据集标记最终踏上海冰的首次记录行?
在R中标记北极熊最终踏上海冰的起始记录
需求说明
我们需要给每只北极熊的行为记录新增一列,标记最终踏上海冰的起始记录——即该记录是这只熊首次进入海冰区域,且之后再也没有回到陆地的那条记录。
示例数据
先构造与问题一致的示例数据集:
library(dplyr) bear_data <- tibble( Bear.ID = c(rep("A",7), rep("B",8)), Region = c("Land","Land","Land","Ice","Ice","Ice","Ice", "Land","Ice","Land","Land","Ice","Ice","Ice","Ice") )
实现方法
使用dplyr按北极熊ID分组后,通过以下逻辑完成标记:
- 按记录顺序,判断每条记录之后是否还会出现陆地
- 定位到当前记录为海冰、后续无陆地,且是该熊满足此条件的第一条记录
完整代码如下:
result <- bear_data %>% group_by(Bear.ID) %>% # 标记当前行之后是否还有陆地记录 mutate(has_land_after = rev(cumsum(rev(Region == "Land"))) > 0) %>% # 找到符合条件的起始行,标记为TRUE/FALSE mutate(Departure = ifelse( Region == "Ice" & !has_land_after & row_number() == min(which(Region == "Ice" & !has_land_after)), TRUE, FALSE )) %>% # 可选:转换成文本标签(对应示例中的"Departure"/"Not Departure") mutate(Departure_label = ifelse(Departure, "Departure", "Not Departure")) %>% ungroup() # 查看结果 print(result)
代码解释
rev(cumsum(rev(Region == "Land"))) > 0:从后往前累加陆地出现的次数,再反转回原顺序,以此判断每行之后是否还有陆地记录。min(which(Region == "Ice" & !has_land_after)):定位该熊所有"进入海冰且后续无陆地"记录中的最早行位置。- 通过
ifelse完成最终标记,可按需选择布尔值或文本标签形式。
输出结果
运行后将得到与示例完全匹配的结果:
# A tibble: 15 × 5 Bear.ID Region has_land_after Departure Departure_label <chr> <chr> <lgl> <lgl> <chr> 1 A Land TRUE FALSE Not Departure 2 A Land TRUE FALSE Not Departure 3 A Land TRUE FALSE Not Departure 4 A Ice FALSE TRUE Departure 5 A Ice FALSE FALSE Not Departure 6 A Ice FALSE FALSE Not Departure 7 A Ice FALSE FALSE Not Departure 8 B Land TRUE FALSE Not Departure 9 B Ice TRUE FALSE Not Departure 10 B Land TRUE FALSE Not Departure 11 B Land TRUE FALSE Not Departure 12 B Ice FALSE TRUE Departure 13 B Ice FALSE FALSE Not Departure 14 B Ice FALSE FALSE Not Departure 15 B Ice FALSE FALSE Not Departure
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

