在R中基于时间戳与特定值匹配创建子集数据框
在R中基于时间戳与特定值匹配创建子集数据框
我想要创建一个子集数据框df3,要求当df1的col1值为1,且df2的signal值也为1,同时两者的时间戳(datetime)完全匹配时,将这些记录提取出来。新数据框需要包含datetime、col1和signal这三列。我在Stack Overflow上查了很多问题,但都找不到完全匹配我需求的解法。
以下是我准备的测试数据代码(已补全未写完的部分):
library(lubridate) #> #> Attaching package: 'lubridate' #> The following objects are masked from 'package:base': #> #> date, intersect, setdiff, union # Generate datetime sequence in 15-minute intervals for both dataframes start_time_df1 <- ymd_hms("2024-01-01 00:00:00") datetime_df1 <- seq(from = start_time_df1, by = "15 mins", length.out = 20) start_time_df2 <- ymd_hms("2024-01-01 00:00:00") datetime_df2 <- seq(from = start_time_df2, by = "15 mins", length.out = 35) # Generate random signal values (either 1 or 0) for both dataframes set.seed(123) # for reproducibility signal_df1 <- sample(c(0, 1), size = 20, replace = TRUE) signal_df2 <- sample(c(0, 1), size = 35, replace = TRUE) # 创建df1和df2 df1 <- data.frame(datetime = datetime_df1, col1 = signal_df1) df2 <- data.frame(datetime = datetime_df2, signal = signal_df2)
具体实现方法
我给你整理了两种可行的实现方式,一种是用便捷的dplyr工具包(数据处理常用,代码更清晰),另一种是基础R原生写法,你可以按需选择:
方法一:使用dplyr包(推荐)
如果还没安装dplyr,先运行install.packages("dplyr")完成安装。
library(dplyr) # 第一步:按时间戳内连接两个数据框,只保留两边都存在的时间点 merged_data <- inner_join(df1, df2, by = "datetime") # 第二步:筛选出col1和signal同时为1的记录,得到目标df3 df3 <- merged_data %>% filter(col1 == 1 & signal == 1) # 查看结果 print(df3)
方法二:基础R原生写法
如果不想额外安装工具包,用基础R也能轻松实现:
# 合并两个数据框,仅保留时间戳匹配的行 merged_data <- merge(df1, df2, by = "datetime") # 筛选出col1和signal都为1的记录 df3 <- merged_data[merged_data$col1 == 1 & merged_data$signal == 1, ] # 查看最终结果 print(df3)
简单解释下逻辑
不管用哪种方法,核心都是两步:
- 内连接数据框:只保留两个数据框中时间戳完全一致的记录,自动过滤掉那些只有某一个数据框存在的时间点;
- 条件筛选:精准挑选出
col1和signal同时等于1的行,这样得到的df3就正好包含你需要的datetime、col1和signal三列啦。
备注:内容来源于stack exchange,提问作者LZ24AP
相关产品推荐
相关产品推荐

