R语言:将table转换为dataframe时保留首列及POSIXct类型
保留POSIXct类型的交叉表转DataFrame方案
问题背景
原始DataFrame df 结构如下:
Date Cat <POSIXct> <chr> 1 2019-10-3 A 2 2019-10-3 A 3 2019-10-3 B 4 2019-10-4 A 5 2019-10-4 C 6 2019-10-4 C 7 2019-10-4 C 8 2019-10-5 B 9 2019-10-5 C
执行 df_table <- table(df) 得到分组计数交叉表:
Cat Date A B C 2019-10-3 2 1 0 2019-10-4 1 0 3 2019-10-5 0 1 1
使用 as.data.frame.matrix(df_table) 转换后,Date会变成字符型行名,丢失原POSIXct类型,需要得到Date为第一列且类型保留POSIXct的DataFrame。
解决方案
方法1:基础R手动转换
从已生成的table出发,提取行名并转换类型:
# 将table转为data.frame df_result <- as.data.frame.matrix(df_table) # 提取行名转为POSIXct类型,新增Date列 df_result$Date <- as.POSIXct(rownames(df_result)) # 调整列顺序,将Date移至第一列 df_result <- df_result[, c("Date", "A", "B", "C")] # 清除原行名 rownames(df_result) <- NULL
方法2:tidyverse直接从原始数据生成(推荐)
跳过table转换步骤,直接用tidyverse工具链完成分组计数和宽表转换,自动保留Date的POSIXct类型:
library(tidyverse) df_result <- df %>% count(Date, Cat) %>% # 按日期和类别分组统计数量 pivot_wider( names_from = Cat, # 用Cat的取值作为列名 values_from = n, # 用统计的数量作为列值 values_fill = 0 # 缺失的类别计数填0 )
方法3:data.table高效处理
用data.table的dcast函数直接完成转换,同样保留Date类型:
library(data.table) setDT(df) df_result <- dcast( df, Date ~ Cat, fun.aggregate = length, value.var = "Cat", fill = 0 )
验证类型
执行以下代码确认Date列类型:
class(df_result$Date) # 输出:[1] "POSIXct" "POSIXt"
内容的提问来源于stack exchange,提问作者AlgoManiac
相关产品推荐
相关产品推荐

