如何在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:
priceDate是Date类型,直接用字符串做%in%匹配会因为类型不匹配导致无法命中任何行——R中Date对象和字符串属于不同数据类型,不能直接对比。 - 方法2:逻辑错误,用
&连接多个相等条件意味着要求priceDate同时等于三个不同日期,这显然不可能,因此筛选结果为空。
正确解法
将筛选的日期字符串转换为Date类型后再匹配,代码如下:
dTNew <- dT[priceDate %in% as.Date(c("2024-01-02", "2024-03-05", "2024-03-12"))]
内容的提问来源于stack exchange,提问作者Miko
相关产品推荐
相关产品推荐

