从特定行获取数据

时间:2019-12-28 10:59:10

标签: r subset rows

我正在尝试使用以下代码从两个日期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)

有人可以告诉我怎么了吗?我完全迷路了。

3 个答案:

答案 0 :(得分:2)

您的努力对R语言的工作方式表现出一些误解。要查看“ [”函数在i位置的向量是R认为是什么,只需在控制台上输入向量代码即可:

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作为算术表达式求值,即用除法运算符分隔的数字。即使转换为“ Date”类也会为您提供一组整数,但是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

答案 1 :(得分:1)

没有数据的原因很简单:要查找的日期在数据本身中的指定方式不同:不是01/02/200702/02/2007,而是1/2/20072/2/2007 。同样,Date列是一个因子列(请参阅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 :(得分:-1)

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