【问题标题】:Plot a histogram of subset of a data绘制数据子集的直方图
【发布时间】:2015-07-08 05:58:44
【问题描述】:

!The image shows the screen shot of the .txt file of the data. The data consists of 2,075,259 rows and 9 columns

在近 4 年的时间里,以一分钟的采样率测量一个家庭的电力消耗。提供不同的电量和一些分计量值。

只需要日期为 2007-02-01 和 2007-02-02 的数据。 我试图在上述日期中绘制“Global_active_power”的直方图。

请注意,在此数据集中,缺失值被编码为“?”]

这是我试图绘制直方图的代码:

{

data <- read.table("household_power_consumption.txt", header=TRUE)
my_data <- data[data$Date %in% as.Date(c('01/02/2007', '02/02/2007'))]

my_data <- gsub(";", " ", my_data)    # replace ";" with " "  
my_data <- gsub("?", "NA", my_data)   # convert "?" to "NA"
my_data <- as.numeric(my_data)      # turn into numbers

hist(my_data["Global_active_power"])

}

运行代码后显示此错误:

hist.default(my_data["Global_active_power"]) 中的错误: 无效的“休息”次数

你能帮我找出代码中的错误吗?

数据文件链接:https://d396qusza40orc.cloudfront.net/exdata%2Fdata%2Fhousehold_power_consumption.zip

【问题讨论】:

    标签: r histogram


    【解决方案1】:

    您需要明确提供分隔符(“;”),并且您的类型不是您认为的那样,请注意:

    data <- read.table("household_power_consumption.txt", header=TRUE, sep=';', na.strings='?')
    data$Date <- as.Date(data$Date, format='%d/%m/%Y')
    bottom.date <- as.Date('01/02/2007', format='%d/%m/%Y')
    top.date <- as.Date('02/02/2007', format='%d/%m/%Y')
    my_data <- data[data$Date > bottom.date & data$Date < top.date,3] 
    hist(my_data)
    

    给出 作为情节。希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      鉴于您有 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 将来能够自动处理的事情。

      1. data.table 命令可以链接(从左到右);我正在使用它在分配数据之前对数据进行子集化。这取决于您是否发现它更具可读性,因为只有微小的性能差异。

      2. 由于我们必须将数字字段读取为字符串,因此我们现在将它们重新转换为数字;这是这样做的标准data.table 语法。

      3. 一旦我们获得了我们喜欢且类型正确的数据子集,我们就可以将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))]
      

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 2019-09-19
        • 1970-01-01
        • 2017-12-08
        • 2022-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-13
        相关资源
        最近更新 更多