R语言从数据框提取每个A类track前最后一个R的时间戳
R语言实现匹配A记录前最后一个R时间戳的方案
原代码错误原因
- 核心逻辑错误:
last(df$track[i] == 'R')仅判断当前行的track是否为R,没有查找当前行之前的所有R记录,返回的是逻辑值而非时间戳 - 输出长度错误:循环中无论当前行是不是A都执行拼接操作,最终向量长度和原数据集行数一致,不符合要求
最优实现方案(纯base R,无需额外依赖,12000行数据毫秒级运行)
利用findInterval函数批量匹配,逻辑简洁效率高:
# 1. 提取所有R对应的时间戳(数据本身按时间升序排列的话可省略sort) r_time <- sort(df$timestamp[df$track == 'R']) # 2. 提取所有A对应的时间戳 a_time <- df$timestamp[df$track == 'A'] # 3. 匹配每个A之前的最后一个R时间,无匹配则返回0 idx <- findInterval(a_time, r_time) result <- ifelse(idx == 0, 0, r_time[idx])
提示:如果你的数据读取时没有识别到表头,时间戳列名为V1,将上述代码中的
df$timestamp替换为df$V1即可。
修正后的循环实现(仅做逻辑参考,大数据量不推荐)
如果需要用循环实现,修正后逻辑如下:
# 初始化变量 last_r <- 0 result <- c() # 遍历全量数据 for (i in seq_len(nrow(df))) { if (df$track[i] == 'R') { # 遇到R就更新最后一个R的时间记录 last_r <- df$timestamp[i] } else if (df$track[i] == 'A') { # 遇到A就把当前最新的R时间加入结果向量 result <- c(result, last_r) } }
效果验证
用你提供的示例数据运行上述代码,得到的result输出为0 0.185 0.221 0.412 0.412 0.412,完全匹配预期结果。
内容的提问来源于stack exchange,提问作者Zack
相关产品推荐
相关产品推荐

