R语言如何按POSIXct区间复制行粘贴到原数据框顶部
问题描述
我的数据框结构如下:
dput(head(sAUR,50)) structure(list(date = structure(c(1475315922, 1475660422, 1475920222, 1476179992, 1476524422, 1476784232, 1477044062, 1477388482, 1477648302, 1477911722, 1478256142, 1478515962, 1478775782, 1479120192, 1479380002, 1479639822, 1479984232, 1480244042, 1480503862, 1480848262, 1481108072, 1481367882, 1481712272, 1481972082, 1482231892, 1482576282, 1482836082, 1483095882, 1483440272, 1484304241, 1484564041, 1484823831, 1485428001, 1485687791, 1486032161, 1486291941, 1486551731, 1486896101, 1487155881, 1487415671, 1487760031, 1488019821, 1488279601, 1488624021, 1488883821, 1489143521, 1489488011, 1489747821, 1490007451, 1490352021), class = c("POSIXct", "POSIXt"), tzone = ""), layer = rep("AUR",50)), row.names = c(NA, 50L), class = "data.frame")
需求:复制2017-02-18 11:01:11(对应时间戳1487415671)到2017-03-20 10:57:31(对应时间戳1490007451)区间内的所有行,保留全部原始数据,将这部分行粘贴到数据框最顶部。基于**行索引(index)**的实现方案也可接受,需要对应的解决思路与代码参考。
实现方案
两种方案均基于R基础语法,无需安装第三方包:
方案1:按时间条件匹配目标行
不需要提前查询行号,直接通过时间列的区间判断筛选目标片段,容错性更高:
# 定义时间区间边界 start_time <- as.POSIXct(1487415671, origin = "1970-01-01") end_time <- as.POSIXct(1490007451, origin = "1970-01-01") # 提取区间内的所有行 selected_block <- sAUR[sAUR$date >= start_time & sAUR$date <= end_time, ] # 将提取的片段拼接在原始数据顶部,得到结果 result <- rbind(selected_block, sAUR)
方案2:按行索引提取目标行
如果已经明确目标片段的起止行号,直接按索引取数即可,执行速度更快:
以给出的50行示例数据为例,1487415671对应第40行,1490007451对应第49行,实际使用时替换为自身数据对应的真实行号即可
# 定义目标行的起止索引 start_row <- 40 end_row <- 49 # 按行号提取片段 selected_block <- sAUR[start_row:end_row, ] # 拼接得到结果 result <- rbind(selected_block, sAUR)
补充说明
- 上述代码不会修改原始的
sAUR对象,结果存储在result变量中,校验结果无误后再覆盖原变量即可 - 如果数据的时间列设置了特定时区,在
as.POSIXct中补充tzone参数和原数据时区保持一致,避免筛选错位 - 如果不需要保留重复行,拼接完成后可通过
result[!duplicated(result$date), ]按时间列去重
内容的提问来源于stack exchange,提问作者Cláudio Siva
相关产品推荐
相关产品推荐

