【问题标题】:taking data from specific rows从特定行获取数据
【发布时间】:2019-12-28 10:59:10
【问题描述】:

我正在尝试使用以下代码从 01/02/2007 和 02/02/2007 这两个日期中提取数据。

exdata1 <- exdata[c(01/02/2007,02/02/2007),]

但是当我查看我收到的代码时,它给了我这个。

> head(exdata1)
[1] Date                  Time                  Global_active_power   Global_reactive_power Voltage               Global_intensity      Sub_metering_1       
[8] Sub_metering_2        Sub_metering_3       
<0 rows> (or 0-length row.names)

谁能告诉我出了什么问题?我完全迷路了。

【问题讨论】:

  • dput(exdata)分享您的数据
  • 是耗电量txt文件github.com/rdpeng/ExData_Plotting1exdata是我读到这样的数据 read.table("household_power_consumption.txt", header = TRUE, sep = ";")
  • 首先,使用实际日期并强制exdata$Date &lt;- as.Date(exdata$Date, "%d/%m/%Y")。然后子集d &lt;- as.Date(c("01/02/2007", "02/02/2007"), "%d/%m/%Y");exdata[exdata$Date %in% d, ]
  • subset(exdata, Date %in% d)
  • 嘿,非常感谢你,head() 现在显示有用的信息。必须强制日期是否有原因?

标签: r subset rows


【解决方案1】:

您没有得到数据的原因很简单:您要查找的日期在数据本身中的指定方式不同:不是01/02/200702/02/2007,而是1/2/20072/2/2007。此外,Datecolumn 是一个因子列(参见str(data))。要访问因素,您可以在日期前后使用引号:

example <- data[data$Date=="1/2/2007"|data$Date=="2/2/2007",]
head(example)
          Date     Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1
66637 1/2/2007 00:00:00               0.326                 0.128 243.150            1.400          0.000
66638 1/2/2007 00:01:00               0.326                 0.130 243.320            1.400          0.000
66639 1/2/2007 00:02:00               0.324                 0.132 243.510            1.400          0.000
66640 1/2/2007 00:03:00               0.324                 0.134 243.900            1.400          0.000
66641 1/2/2007 00:04:00               0.322                 0.130 243.160            1.400          0.000
66642 1/2/2007 00:05:00               0.320                 0.126 242.290            1.400          0.000
      Sub_metering_2 Sub_metering_3
66637          0.000              0
66638          0.000              0
66639          0.000              0
66640          0.000              0
66641          0.000              0
66642          0.000              0

【讨论】:

    【解决方案2】:

    您的努力显示了对 R 语言如何工作的几个误解。要查看 R 对“[”函数的 i 位置中的向量的“想法”是什么,只需在控制台中输入向量代码:

    c(01/02/2007,02/02/2007)
    [1] 0.0002491281 0.0004982561
    

    因此,您实际上是在提交一个包含接近零的小数部分的数字向量。您可以使用数字向量进行选择,但它们必须是大于 1 的整数。即使您确实了解 R 不会将它们用作日期并尝试将其格式化为 R“日期”分类值,您仍然仅使用这些日期作为索引是不会成功的,因为 R Dates 实际上是表示自 1970 年 1 月 1 日以来的天数的整数,并且这些日期将采用非常大的值(13545 和 13546):

    dput( as.Date(c("01/02/2007","02/02/2007"), format="%d/%m/%Y") )
    # structure(c(13545, 13546), class = "Date")
    
    mydf = data.frame( d=as.Date( c("01/02/2007","02/02/2007"), format="%d/%m/%Y") , letters[1:2] )
    mydf
    #------------
               d letters.1.2.
    1 2007-02-01            a
    2 2007-02-02            b
    
    mydf[ as.Date( c("01/02/2007","02/02/2007"), format="%d/%m/%Y") , ]
    #----------------
            d letters.1.2.
    NA   <NA>         <NA>
    NA.1 <NA>         <NA>
    

    因此,您上一条评论/问题的答案是:您称之为“日期”的那些表达从一开始就不是日期;它们只是由斜线分隔的数字,并且它们一起由 R 作为算术表达式进行评估,即作为由除法运算符分隔的数字。即使转换为“日期”类会为您提供一组整数,但 R 解释器不会以您期望的方式处理它们。您需要一种将日期与日期匹配的机制。 %in% 中缀运算符实际上是 R 函数 match 的修饰版本。 %in% 函数实际上是在构建一个可用于选择匹配行的逻辑向量:

     mydf$d %in% as.Date( c("01/02/2007","02/02/2007"), format="%d/%m/%Y") 
    [1] TRUE TRUE
    
     mydf[ mydf$d %in% as.Date( c("01/02/2007","02/02/2007"), format="%d/%m/%Y") , ]
               d lets
    1 2007-02-01    a
    2 2007-02-02    b
    

    【讨论】:

    • 谢谢,我正在努力尽快学习 r,但似乎还需要一段时间才能消化基础知识
    • 我的建议是从学习基本的原子类开始:“字符”、“数字”、“逻辑”和具有属性的类:“因子”、“日期”和 POSIXct”更灵活的类:“list”和“data.frame”。尝试阅读任何引发错误的函数的帮助页面,并尝试了解每个函数如何具有有限数量的类,它将接受其各种参数。
    【解决方案3】:

    您的代码很好,只是没有指定要过滤的列: exdata[c(01/02/2007,02/02/2007),] vs exdata[日期列 %in% c(01/02/2007,02/02/2007),]

    【讨论】:

    • 这完全,完全不正确。请了解 R 中数字和字符分类表达式之间的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多