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)
我经常使用的一个技巧如下:
- 将
POSIXt
列(在下面的示例中 eventDate
)转换为字符
- 执行您需要的 dplyr 操作(在下面的示例中,我们绑定了两个数据帧的行)
- 从字符转换回
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")
我有问题。我下载了数据并将日期转换为 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)
我经常使用的一个技巧如下:
- 将
POSIXt
列(在下面的示例中eventDate
)转换为字符 - 执行您需要的 dplyr 操作(在下面的示例中,我们绑定了两个数据帧的行)
- 从字符转换回
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")