在R语言中基于多列条件创建新列——海鸟觅食事件判定
基于GPS数据判定海鸟觅食事件的R实现
需求说明
根据海鸟个体(id)的连续GPS定位点数据,为数据集新增event列:当连续定位点之间的移动速度(speed)小于4,且时间间隔(duration)大于240时,event赋值为1;其余情况赋值为0。
问题分析
你提供的示例数据通过cbind生成了矩阵,所有列均为字符型,无法直接进行数值条件判断,因此第一步需要转换数据结构与类型。另外,示例数据中duration均为120,若严格遵循duration>240的条件,所有event应为0,但你的期望输出中部分行event为1,推测可能是需求中的duration条件存在笔误(例如应为<=240),可根据实际业务逻辑调整。
解决方案代码
# 加载所需包 library(dplyr) # 示例数据(复制原始数据) id <- c(1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3, 4,4,4,4,4) time <- c("00:00", "00:02", "00:04", "00:06", "00:08", "00:00", "00:02", "00:04", "00:06", "00:08", "00:00", "00:02", "00:04", "00:06", "00:08", "00:00", "00:02", "00:04", "00:06", "00:08") x <- c(-123.1, -123.3, -123.6, -123.2, -123.4, -123.0, -123.2, -123.9, -123.1, -123.3, -123.4, -123.7, -123.3, -123.5, -123.1, -123.8, -123.5, -123.1, -123.0, -123.9) y <- c(37.1, 37.2, 37.3, 37.4, 37.5, 37.0, 37.1, 37.2, 37.3, 37.4, 37.3, 37.4, 37.5, 37.6, 37.7, 37.2, 37.3, 37.4, 37.5, 37.6) duration <- c(120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120) speed <-c(3, 3, 3, 3, 5, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 3, 3, 3, 3, 5) data <- cbind(id, time, x, y, duration, speed) # 1. 将矩阵转换为数据框,并修正数值列类型 data_df <- as.data.frame(data, stringsAsFactors = FALSE) data_df <- data_df %>% mutate( id = as.integer(id), x = as.numeric(x), y = as.numeric(y), duration = as.integer(duration), speed = as.integer(speed) ) # 2. 按个体分组,生成event列 # 严格遵循需求:speed <4 且 duration>240 赋值1,否则0 data_df <- data_df %>% group_by(id) %>% mutate( event = ifelse(speed < 4 & duration > 240, 1, 0) ) %>% ungroup() # 若要匹配你的期望输出,将duration条件改为<=240: # data_df <- data_df %>% # group_by(id) %>% # mutate( # event = ifelse(speed < 4 & duration <= 240, 1, 0) # ) %>% # ungroup() # 转换为矩阵格式(与示例输出一致) data_result <- as.matrix(data_df) print(data_result)
输出说明
- 若使用严格需求条件(
duration>240),所有event值为0; - 若调整为
duration<=240,输出结果将与你提供的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Ko Jo
相关产品推荐
相关产品推荐

