将包含日期的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
的程序包中,这被认为是“好功能”:做一件事,总是返回相同的类/结构,等等。可以考虑以编程上可能无法预测的方式返回list
或vector
的函数。一个问题。 (因此,当我以编程方式处理原始data.frame
副tbls
时,经常在需要防范时添加,drop=FALSE
。)
类似地,您是否曾经被sapply
或mapply
咬伤?如果返回的值都具有相同的长度/类,则将得到vector
或matrix
,但是如果任何长度或类都不相同,则将得到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 < integer
和POSIXt
实际上是numeric
(带有tz info),因此将其强制转换为numeric
。因为其中包含非POSIXt
。 (这同样适用于POSIXt
和Date
类。)(关于他们被逼到的实际数字,我不知道是副手...)
关于r - 从Excel导入到R中的日期以不同方式转换为字符时会产生不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50283340/