使用dplyr和POSIXlt数据时遇到的问题

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"))

数据框是关于一款在线游戏中的交易的。它包含数值(支付金额)、交易日期、安装日期和ID等信息。我添加了一个新的列,它显示安装后的天数。我试图使用dlyr来汇总数据。

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

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

我该如何解决它呢?

更新。我将Date列的类更改为字符类。问题得到了解决。但是在我的数据集中能否使用dlyr而不更改类呢?


20
请使用POSIXct代替。 - eddi
7
Eddi说要在strptime函数调用中加上as.POSIXct - IRTFM
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))

7

正如在这里所提到的,这是tidyverse的一个“特性”。他们不想处理POSIXlt对象,因为它是向量中的一种列表。然而,使用as.POSIXct并不总是一个选择。在我的情况下,我确实需要POSIXlt类来处理一些未经清理的数据。那么,在这种情况下,就回到稳定的基础R。在你的情况下:

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

0

我经常使用的一个技巧是:

  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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接