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

如何在R中基于指定priceDate值生成data.table的子表?

问题与解决方法

原数据结构

以下是名为dT的data.table结构:

structure(list(delivDate = structure(c(20489, 20500, 20516, 20517, 
20518, 20533), class = "Date"), priceDate = structure(c(19724, 
19724, 19724, 19724, 19724, 19724), class = "Date"), priceIndex = c("KELAG HPFC DE", 
"HPFC DE", "HPFC DE", "HPFC DE", "HPFC DE", 
"HPFC DE"), avgPrice = c(109.65, 104.35, 104.5, 103.91, 
100.38, 76.57), quarters = c("Q1", "Q1", "Q1", "Q1", "Q1", "Q1"
)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
))

需求

生成包含原表所有列,但仅保留priceDate为"2024-01-02"、"2024-03-05"、"2024-03-12"对应行的子表。

错误操作及结果

尝试两种方法均得到空data.table,错误提示:

Empty data.table (0 rows and 5 cols): delivDate,priceDate,priceIndex,avgPrice,quarters

错误方法1:

DT <- DT[priceDate %in% c("2024-01-02", "2024-03-05", "2024-03-12"), ]

错误方法2:

base::subset(dT, (priceDate == '2024-01-02') & (priceDate == '2024-03-05') & (priceDate == '2024-03-12'))

错误原因

  1. 方法1:priceDate是Date类型,直接用字符串做%in%匹配会因为类型不匹配导致无法命中任何行——R中Date对象和字符串属于不同数据类型,不能直接对比。
  2. 方法2:逻辑错误,用&连接多个相等条件意味着要求priceDate同时等于三个不同日期,这显然不可能,因此筛选结果为空。

正确解法

将筛选的日期字符串转换为Date类型后再匹配,代码如下:

dTNew <- dT[priceDate %in% as.Date(c("2024-01-02", "2024-03-05", "2024-03-12"))]

内容的提问来源于stack exchange,提问作者Miko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:45:11