【发布时间】:2015-04-30 20:33:56
【问题描述】:
我有一个包含 400k 行的数据表,我正在做子集,它非常慢。
这是一个示例数据框:
date name value size car1 car2
1 2015-01-01 07:44:00 bob 1 5 A D
2 2015-02-02 09:46:00 george 522 2 B F
现在我使用subset() 以慢速方式对其进行子集化:
main<- data.frame(date = as.POSIXct(c("2015-01-01 07:44:00","2015-02-02 09:46:00"),tz="GMT"),name= c("bob","george"),value=c(1,522), size= c(5,2), car1=c("A","B"), car2=c("D","F"))
main$date
subset(main, size >1
& value == 522
& name == "george"
& date >= as.POSIXct("2015-01-01 03:44:00",tz="GMT") & date >= as.POSIXct("2015-01-01 08:44:00",tz="GMT")
& (car1 == "F" | car2 == "F")
)
date name value size car1 car2
2 2015-02-02 09:46:00 george 522 2 B F
这可行并返回 1 行,但速度很慢。
感谢对另一个问题的一些回应,使用 data.table 看起来要快得多,所以我想使用 data.table 来做与上面相同的事情,但我有很多问题。
这是我目前为止的:
library(data.table)
mdt<- as.data.table(main)
setkey(mdt, date, name, value,size,car1,car2)
mdt[.(as.POSIXct("2015-01-01 03:44:00"),"george", 522,2,"F","F")]
这会返回:
date name value size car1 car2
1: 2015-01-01 03:44:00 george 522 2 NA F
这是我的问题:
(1) 我想要一个条件,其中日期 >= 和日期
(2) 我想要一个标准,其中 (car1 == "F" | car2 == "F") 但这可能吗?如果没有任何想法如何使子集更快?
(3) 您可以看到 mdt[] 的输出日期为 2015-01-01 03:44:00,但该日期不在原始“主”数据框中。这里发生了什么?
(4) 您可以在 mdt[] 的输出中看到,当原始“主”数据帧中的 car1 不是 NA 时,car1 的值为 NA。这里发生了什么?
谢谢。
【问题讨论】:
-
对于 (1),我认为
roll参数可能对不等式有帮助,但我自己还没有学会。我会把它留给 eddi 或其他比我更有知识的人之一。您也可以查看 wiki 或课程以了解可行的方法:github.com/Rdatatable/data.table/wikidatacamp.com/courses/data-table-data-manipulation-r-tutorial -
对于 (2),您能否扩展您的示例以涵盖该应用程序?
-
我认为您的
setkey应该更加明确。除非您使用每个字段,否则您不需要包含每个字段。但是所有这些都应该在data.table中是可行的——我只是不经常处理日期。xmpl <- data.table(v1 = c("a", "a", "b", "c"), v2 = 1:4); xmpl[v1 == "a" & v2 > 1 & v2 < 4];setkey(xmpl, v1); xmpl["j"]请注意,一旦您在带键的 data.table 上给出了值,它将根据您给它的值返回——无论该键是否在表中。 -
@ Frank -- 我不知道如何扩展 or 语句的 data.table 语法。我在问有没有可能。
-
对于 (3) 和 (4),它旨在做到这一点。
J的每一行将在输出中至少有一行。如果没有匹配,它将有NA用于未连接的列。要禁用此功能,请尝试mdt[.(as.POSIXct("2015-01-01 03:44:00"),"george", 522,2,"F","F"),nomatch=FALSE]
标签: r data.table