【问题标题】:Converting Factor to Date without creating NA's在不创建 NA 的情况下将因子转换为日期
【发布时间】:2014-06-05 19:59:41
【问题描述】:

我在将因子转换为日期时遇到了问题;它正在产生我不想要的 NA 值。

我的问题的数据可以在这里找到:(https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2Factivity.zip)

x <- read.csv("activity.csv")
head(x)

steps       date interval
1    NA 2012-10-01        0
2    NA 2012-10-01        5
3    NA 2012-10-01       10
4    NA 2012-10-01       15
5    NA 2012-10-01       20
6    NA 2012-10-01       25

目标:我试图找出每天平均总步数。所以首先,我需要对值进行分类,以便每个数据点对应于给定日期的总和

x$Day <- as.Date(cut(x$date, breaks = "day"))

Error in cut.default(x$date, breaks = "day") : 'x' must be numeric

只需用 class 函数确认这一点

class(x[,2])

“因素”

这很奇怪,因为从上面的 head(x) 看,它看起来像是 Date。无论如何,为了使用 cut 函数对值进行分类,以便每个数据点对应于给定日期的总和,我需要将日期更改为“日期”类

x[,2] <- as.Date(x[,2], format="%Y/%m/%d")
class(x[,2])

[1]“日期”

好的,所以理论上我现在应该能够对值进行分箱

x$Day <- as.Date(cut(x$date, breaks = "day"))

seq.int(0, to0 - from, by) 中的错误:'to' 不能是 NA、NaN 或无穷大 另外:警告信息: 1: 在 min.default(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, : min 没有不可缺少的参数;返回 Inf 2: 在 max.default(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, : max 没有非缺失参数;返回 -Inf

head(is.na(x))

steps date interval
[1,]  TRUE TRUE    FALSE
[2,]  TRUE TRUE    FALSE
[3,]  TRUE TRUE    FALSE
[4,]  TRUE TRUE    FALSE
[5,]  TRUE TRUE    FALSE
[6,]  TRUE TRUE    FALSE

如果我将此与我在x[,2] &lt;- as.Date(x[,2], format="%Y/%m/%d") 之前看到的内容进行比较

head(is.na(x))

steps  date interval
[1,]  TRUE FALSE    FALSE
[2,]  TRUE FALSE    FALSE
[3,]  TRUE FALSE    FALSE
[4,]  TRUE FALSE    FALSE
[5,]  TRUE FALSE    FALSE
[6,]  TRUE FALSE    FALSE

不确定这里发生了什么?我知道这应该可行,因为我从以下教程 (http://blog.mollietaylor.com/2013/08/plot-weekly-or-monthly-totals-in-r.html?m=1) 中得到了这个想法

sessionInfo()

R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_Canada.1252 
[2] LC_CTYPE=English_Canada.1252   
[3] LC_MONETARY=English_Canada.1252
[4] LC_NUMERIC=C                   
[5] LC_TIME=English_Canada.1252    

attached base packages:
[1] stats     graphics  grDevices utils    
[5] datasets  methods   base     

other attached packages:
[1] scales_0.2.4  ggplot2_1.0.0

loaded via a namespace (and not attached):
[1] colorspace_1.2-4 digest_0.6.4    
[3] grid_3.0.3       gtable_0.1.2    
[5] MASS_7.3-29      munsell_0.4.2   
[7] plyr_1.8.1       proto_0.3-10    
[9] Rcpp_0.11.1      reshape2_1.4    
[11] stringr_0.6.2    tools_3.0.3   

【问题讨论】:

  • 你应该设置正确的格式分隔符“-”而不是“\”来获得:as.Date(x[,2], format="%Y-%m-%d")
  • 这一切对我来说似乎很困惑。如果您拥有的是日期,而不是日期时间,并且您需要按天汇总,那为什么还需要使用 cut 呢?数据已经达到您想要的粒度。然后您遇到了 agstudy 提到的格式问题,以及 cut 总是返回一个间隔因子的事实,因此将其结果强制回溯是没有意义的。

标签: r class date cut na


【解决方案1】:

只是为了说明,这些都导致相同的输出(当然除了日期列的类):

x <- read.csv("~/Downloads/activity.csv")
# Date is a factor
r1 <- aggregate(steps~date,data = x,FUN = mean)

x1 <- read.csv("~/Downloads/activity.csv",stringsAsFactors = FALSE)
# Date is a character
r2 <- aggregate(steps~date,data = x1,FUN = mean)

x2 <- x
x2$date <- as.Date(as.character(x$date))
# Date is a date
r3 <- aggregate(steps~date,data = x2,FUN = mean)

【讨论】:

    【解决方案2】:
    my_data <-
      read.csv(your_file, stringsAsFactors = FALSE)
    
    # Convert 'my_data$date' to Date format
    my_data$date <- 
      as.Date(my_data$date)
    

    这应该可以...

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多