dplyr 和 POSIXlt 数据的问题

Problems with dplyr and POSIXlt data

我有问题。我下载了数据并将日期转换为 POSIXlt 格式

df<-read.csv("007.csv", header=T, sep=";")
df$transaction_date<-strptime(df$transaction_date, "%d.%m.%Y")
df$install_date<-strptime(df$install_date, "%d.%m.%Y")
df$days<- as.numeric(difftime(df$transaction_date,df$install_date, units = "days"))

数据框是关于一个网络游戏中的交易。它包含值(它的付款)、transaction_date、intall_date 和 ID。我添加了新列,安装后几天显示。我尝试使用 dlyr

来总结数据

df2<-df %>% group_by(days) %>% summarise(sum=sum(value))

我有一个错误: 错误:列 'transaction_date' 具有不受支持的类型:POSIXlt、POSIXt

我该如何解决?

更新。我将日期列的 类 更改为字符。它解决了问题。但是我可以在不更改数据集中的 类 的情况下使用 dlyr 吗?

您可以按照评论中的建议使用 as.POSIXct,但如果小时、分钟和秒无关紧要,那么您应该只使用 as.Date

df <- read.csv("007.csv", header=T, sep=";")

df2 <- df %>%
  mutate(
     transaction_date = as.Date(transaction_date, "%d.%m.%Y")
     ,install_date = as.Date(install_date, "%d.%m.%Y")
  ) %>%
  group_by(days = transaction_date - install_date) %>%
  summarise(sum=sum(value))

如前所述here,这是 tidyverse 的 "feature"。他们不想处理 POSIXlt 对象,因为它是向量中的某种列表。但是,使用 as.POSIXct 并不总是一种选择。就我而言,我确实需要 POSIXlt class 来处理一些未清理的数据。在那种情况下,只需回到良好的旧稳定基础 R。在你的情况下:

df2 <- aggregate(df1$value, by=list(df$days), sum)

我经常使用的一个技巧如下:

  1. POSIXt 列(在下面的示例中 eventDate)转换为字符
  2. 执行您需要的 dplyr 操作(在下面的示例中,我们绑定了两个数据帧的行)
  3. 从字符转换回 POSIXt 不要忘记设置正确的格式 (format) 和时区 (tz),就像执行步骤 1 之前一样。

示例:

# step 1
df1$eventDate <- as.character.POSIXt(df1$eventDate)
df2$eventDate <- as.character.POSIXt(df2$eventDate)
#step 2
merged_df <- bind_rows(df1, df2)
#step 3
merged_df$eventDate <- strptime(merged_df$eventDate, format = "%Y-%m-%d", tz = "UTC")