将包含日期的Excel电子表格导入R(使用readxl)。例如。

`# A tibble: 9 x 2
     id       date
  <dbl>     <dttm>
1     1 2000-01-23
2     2 2000-01-24
3     3 2000-01-25
4     4 2000-01-26
5     5 2000-01-27
6     6 2000-01-28
7     7 2000-01-29
8     8 2000-01-30
9     9 2000-01-31`

现在将日期列转换为字符:
  • 使用$
  • > as.character(dat$date)[1] "2000-01-23" "2000-01-24" "2000-01-25" "2000-01-26" "2000-01-27" "2000-01-28" "2000-01-29" "2000-01-30" "2000-01-31"
  • 使用[[]]
  • > as.character(dat[[2]])[1] "2000-01-23" "2000-01-24" "2000-01-25" "2000-01-26" "2000-01-27" "2000-01-28" "2000-01-29" "2000-01-30" "2000-01-31"
  • 使用[,]
  • > as.character(dat[ , 2])[1] "c(948585600, 948672000, 948758400, 948844800, 948931200, 949017600, 949104000, 949190400, 949276800)"
    为什么第三种情况产生不同的结果?我相信前两种情况会返回 vector ,而第三种情况会返回数据帧,但是为什么会有区别呢?情况3的数字从哪里来? (这些数字与Excel用于表示日期的数字不一致。)

    最佳答案

    区别在于您有一个tibble,而不是data.frame。如果子设置返回单列或单行,则data.frame默认情况下将减少为 vector ;您可以选择使用drop=F(请参见下文)来防止这种情况。

    在基于tidyverse的程序包中,这被认为是“好功能”:做一件事,总是返回相同的类/结构,等等。可以考虑以编程上可能无法预测的方式返回listvector的函数。一个问题。 (因此,当我以编程方式处理原始data.frametbls时,经常在需要防范时添加,drop=FALSE。)

    类似地,您是否曾经被sapplymapply咬伤?如果返回的值都具有相同的长度/类,则将得到vectormatrix,但是如果任何长度或类都不相同,则将得到list,无论您期望与否。这是使用sapply(..., simplify=FALSE)lapply(...)mapply(..., SIMPLIFY=FALSE)始终“证明”的一种理由。这也是purrr::map系列函数的部分合理性。

    例子:

    library(dplyr)
    d1 <- data.frame(dt=seq.Date(as.Date('2000-01-23'),as.Date('2000-01-30'),by='day'))
    d2 <- as.tbl(d1)
    
    d1[,1]
    # [1] "2000-01-23" "2000-01-24" "2000-01-25" "2000-01-26" "2000-01-27"
    # [6] "2000-01-28" "2000-01-29" "2000-01-30"
    d2[,1]
    # # A tibble: 8 × 1
    #           dt
    #       <date>
    # 1 2000-01-23
    # 2 2000-01-24
    # 3 2000-01-25
    # 4 2000-01-26
    # 5 2000-01-27
    # 6 2000-01-28
    # 7 2000-01-29
    # 8 2000-01-30
    

    为什么这会产生一些时髦?由于数据中还有其他原因。
    d1$id <- 1:nrow(d1)
    d2$id <- 1:nrow(d2)
    as.character(d2)
    # [1] "c(10979, 10980, 10981, 10982, 10983, 10984, 10985, 10986)"
    # [2] "1:8"
    as.character(d1[,1])
    # [1] "2000-01-23" "2000-01-24" "2000-01-25" "2000-01-26" "2000-01-27"
    # [6] "2000-01-28" "2000-01-29" "2000-01-30"
    as.character(d1[,1,drop=FALSE])
    # [1] "c(10979, 10980, 10981, 10982, 10983, 10984, 10985, 10986)"
    as.character(d2[,1])
    # [1] "c(10979, 10980, 10981, 10982, 10983, 10984, 10985, 10986)"
    

    在整个框架上调用函数时(无论是否为tibble),它通常会将所有列转换为最低通用格式character < numeric < integerPOSIXt实际上是numeric(带有tz info),因此将其强制转换为numeric。因为其中包含非POSIXt。 (这同样适用于POSIXtDate类。)

    (关于他们被逼到的实际数字,我不知道是副手...)

    关于r - 从Excel导入到R中的日期以不同方式转换为字符时会产生不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50283340/

    10-12 16:38