来自向量的R数据帧列

时间:2015-07-09 07:01:00

标签: r dataframe

我必须错过这里显而易见的事情,但为此:

> 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将向量转换为单列数据帧中的两行。我尝试了cbindmatrixtlist的各种组合,并尝试进行解构。这样做的最佳方式是什么?

3 个答案:

答案 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<-来设置向量的维度,则printas.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"