You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)

简单解释下逻辑

不管用哪种方法,核心都是两步:

  1. 内连接数据框:只保留两个数据框中时间戳完全一致的记录,自动过滤掉那些只有某一个数据框存在的时间点;
  2. 条件筛选:精准挑选出col1和signal同时等于1的行,这样得到的df3就正好包含你需要的datetime、col1和signal三列啦。

备注:内容来源于stack exchange,提问作者LZ24AP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 07:38:02