R中如何基于日内时间将单个dataframe拆分为两个独立数据集
tidyverse 实现方案
核心逻辑是按年月日分组后对时间排序,给组内行打上序号后拆分:
library(tidyverse) library(lubridate) # 构造示例数据 df <- structure(list(id = 1:6, date = structure(c(1426353511, 1426353536, 1427390312, 1427390336, 1428427112, 1428427137), tzone = "UTC", class = c("POSIXct", "POSIXt"))), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame")) # 数据处理 df_processed <- df %>% group_by(date_only = as_date(date)) %>% # 提取年月日作为分组依据 arrange(date, .by_group = TRUE) %>% # 组内按时间升序排列 mutate(time_rank = row_number()) %>% # 组内生成时间先后序号 ungroup() # 拆分得到结果 df1 <- df_processed %>% filter(time_rank == 1) %>% select(id, date) df2 <- df_processed %>% filter(time_rank == 2) %>% select(id, date)
如果你的场景中单日可能存在多于2条数据,调整filter的序号筛选规则即可适配。
base R 实现方案
逻辑和tidyverse版本一致,用base原生函数实现:
# 构造示例数据 df <- structure(list(id = 1:6, date = structure(c(1426353511, 1426353536, 1427390312, 1427390336, 1428427112, 1428427137), tzone = "UTC", class = c("POSIXct", "POSIXt"))), row.names = c(NA, -6L), class = "data.frame") # 数据处理 df$date_only <- as.Date(df$date) # 提取年月日分组标识 df_sorted <- df[order(df$date_only, df$date), ] # 按日期先后排序 df_split <- split(df_sorted, df_sorted$date_only) # 按年月日拆分分组 # 提取每组的第1、2行合并得到结果 df1 <- do.call(rbind, lapply(df_split, function(x) x[1, c("id", "date")])) df2 <- do.call(rbind, lapply(df_split, function(x) x[2, c("id", "date")])) # 重置行名(可选) rownames(df1) <- NULL rownames(df2) <- NULL
内容的提问来源于stack exchange,提问作者bird
相关产品推荐
相关产品推荐

