26

我有个问题。我下载了数据并将日期转换为 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

我该如何解决?

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

4

3 回答 3

18

您可以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))
于 2016-11-17T04:54:05.400 回答
7

如此处所述,这是 tidyverse 的“功能”。他们不想处理POSIXlt对象,因为它是向量中的某种列表。然而,使用as.POSIXct并不总是一种选择。就我而言,我真的需要POSIXlt类来处理一些未清理的数据。在这种情况下,只需回到良好的旧稳定基础 R。在您的情况下:

df2 <- aggregate(df1$value, by=list(df$days), sum)
于 2018-01-31T16:04:04.277 回答
0

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

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

例子:

# 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")
于 2018-10-18T18:40:48.937 回答