我必须错过这里显而易见的事情,但为此:
> range(data$timestamp)
[1] "2015-06-29 09:32:43.000 UTC" "2015-07-03 15:50:35.986 UTC"
我想做类似的事情:
df <- data.frame(as.Date(range(data$timestamp)))
names(df) <- c('from', 'to')
并获取一个数据框,其中包含'from'和'to'列,而不需要额外的变量来索引。如上所述data.frame
将向量转换为单列数据帧中的两行。我尝试了cbind
,matrix
,t
,list
的各种组合,并尝试进行解构。这样做的最佳方式是什么?
答案 0 :(得分:5)
df <- as.data.frame(as.list(as.Date(range(data$timestamp))))
names(df) <- c('from', 'to')
这会奏效。毕竟data.frame
只是特别的list
。
如果您想要单行,则可以使用setNames
。我现在使用magrittr
发现这种类型的东西更具可读性:
data$timestamp %>% range %>% as.Date %>% as.list %>% as.data.frame %>% setNames(c("from", "to")
或者,您可以通过矩阵进行投射:
df <- as.data.frame(matrix(as.Date(range(data$timestamp)), ncol = 2))
names(df) <- c('from', 'to')
但是,这将从日期中删除class
(和其他属性)。如果您使用dim<-
来设置向量的维度,则print
和as.data.frame
都不会将其视为矩阵(因为它仍然具有class
{{1} })。
为了解决这个问题,请在创建data.frame后转换为Date:
Date
答案 1 :(得分:3)
您可以尝试:
range_timestamp <- c("2015-06-29 09:32:43.000 UTC", "2015-07-03 15:50:35.986 UTC")
df <- data.frame(from=as.Date(range_timestamp[1]), to=as.Date(range_timestamp)[2])
df
# from to
#1 2015-06-29 2015-07-03
另一个选项,使用data.table
并避免编制索引:
require(data.table)
df <- `colnames<-`(data.frame(rbind(range_timestamp)), c("from","to"))
df <- setDT(df)[, lapply(.SD, as.Date)]
df
from to
1: 2015-06-29 2015-07-03
或者,正如@akrun在评论中提到的那样:
require(data.table)
df <- setnames(setDT(as.list(as.Date(range_timestamp))), c('from', 'to'))[]
答案 2 :(得分:1)
我的建议太迟了几秒钟。正如我所见,其他人已经回答了。无论如何:这是一个类似于你所尝试的替代方案:
timestamp <-c("2015-06-29 09:32:43.000 UTC","2015-07-03 15:50:35.986 UTC")
df <- t(data.frame(as.Date(range(timestamp))))
colnames(df) <- c('from', 'to')
rownames(df) <- NULL
#> df
# from to
#[1,] "2015-06-29" "2015-07-03"