web-dev-qa-db-ja.com

dplyrおよびPOSIXltデータの問題

私は問題があります。データと変換された日付を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"))
_

データフレームは、1つのオンラインゲームでのトランザクションに関するものです。値(その支払い)、transaction_date、intall_date、IDが含まれます。インストール後数日で表示される新しい列を追加しました。 dlyrを使用してデータを要約しようとしました

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

エラーが発生しました:エラー:列 'transaction_date'にサポートされていないタイプがあります:POSIXlt、POSIXt

どうすれば修正できますか?

UPD。日付列のクラスを文字に変更しました。問題を解決しました。しかし、データセットのクラスを変更せずにdlyrを使用できますか?

24
Slavka

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))
15
JackStat

前述のように here は、これがTidyverseの「機能」です。 POSIXltオブジェクトはベクター内のある種のリストであるため、処理したくありません。ただし、as.POSIXctは常にオプションとは限りません。私の場合、クリーンアップされていないデータを処理するためにPOSIXltクラスが本当に必要でした。その場合は、古き良き安定したベースRに戻ってください。あなたの場合:

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

私がよく使う1つのトリックは次のとおりです。

  1. POSIXt列(以下の例ではeventDate)を文字に変換します
  2. 必要なdplyr操作を実行します(以下の例では、2つのデータフレームの行をバインドします)
  3. 手順1を実行する前と同じように、文字からPOSIXtに変換して、正しい形式(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")
0
damianooldoni