鉴于您有 200 万行(虽然不是太多列),您已牢牢进入fread 领域;
这就是我会如何做你想做的事:
library(data.table)
data<-fread("household_power_consumption.txt",sep=";", #1
na.strings=c("?","NA"),colClasses="character" #2
)[,Date:=as.Date(Date,format="%d/%m/%Y")
][Date %in% seq(from=as.Date("2007-02-01"), #3
to=as.Date("2007-02-02"),by="day")]
numerics<-setdiff(names(data),c("Date","Time")) #4
data[,(numerics):=lapply(.SD,as.numeric),.SDcols=numerics]
data[,hist(Global_active_power)] #5
简要说明发生了什么
1:请参阅data.table vignettes 以了解该软件包的详细介绍。在这里,鉴于您的数据结构,我们预先告诉fread ; 是分隔字段的内容(这是非标准的)
2:我们可以预先告诉fread,它可以在某些列中期待?,并且应该将它们视为NA——例如,在设置na.strings之前,这里是data[8640]:
Date Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3
1: 21/12/2006 11:23:00 ? ? ? ? ? ? NA
一旦我们设置了na.strings,我们就不必稍后将? 替换为NA:
Date Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3
1: 21/12/2006 11:23:00 NA NA NA NA NA NA
另一方面,我们还必须将这些字段读取为characters,即使它们是数字。这是我希望fread 将来能够自动处理的事情。
data.table 命令可以链接(从左到右);我正在使用它在分配数据之前对数据进行子集化。这取决于您是否发现它更具可读性,因为只有微小的性能差异。
由于我们必须将数字字段读取为字符串,因此我们现在将它们重新转换为数字;这是这样做的标准data.table 语法。
一旦我们获得了我们喜欢且类型正确的数据子集,我们就可以将hist 作为j 中的参数传递并得到我们想要的。
请注意,如果您希望从该数据集中获得的全部都是直方图,您可以稍微压缩一下代码:
ok_dates<-seq(from=as.Date("2007-02-01"),
to=as.Date("2007-02-02"),by="day")
fread("household_power_consumption.txt",sep=";",
select=c("Date","Global_active_power"),
na.strings=c("?","NA"),colClasses="character"
)[,Date:=as.Date(Date,format="%d/%m/%Y")
][Date %in% ok_dates,hist(as.numeric(Global_active_power))]