0

日付変数を持つデータ フレームを使用すると、ggplot2 ファセットと dplyr group_by でエラーが発生します。このエラーは、最初に日付変数を変換してからデータ フレームを溶かした場合にのみ発生します。反対のことをすると、変数はまったく同じように見えますが、エラーは発生しません。例:

#base df
df <- data.frame(
id = c("A", "B", "C"),
date1 = c("12/Sep/2010", "13/Mar/2011", "05/Jan/2010"),
date2 = c("13/Sep/2010", "14/Mar/2011", "06/Jan/2010"),
value1 = 1:3,
value2 = 4:6
)

df
id       date1       date2 value1 value2
1  A 12/Sep/2010 13/Sep/2010      1      4
2  B 13/Mar/2011 14/Mar/2011      2      5
3  C 05/Jan/2010 06/Jan/2010      3      6

mutate の例を示しますが、df$date <- as.Date(df$date) を使用すると、同じエラーが発生します。申し訳ありませんが、データを整理するための醜くて非効率的なコードです(提案をいただければ幸いです:-))。

#mutate first
df_muta <- df %>% mutate_each(funs(as.Date(., format = "%d/%b/%Y")), c(starts_with("date")))
df_muta <- data.frame(
  id = melt(df_muta, id.vars = c("id"), measure.vars = c("date1", "date2"))[[1]],
  date = melt(df_muta, id.vars = c("id"), measure.vars = c("date1", "date2"))[[3]],
  value = melt(df_muta, id.vars = c("id"), measure.vars = c("value1", "value2"))[[3]])

str(df_muta)
'data.frame':  6 obs. of  3 variables:
  $ id   : Factor w/ 3 levels "A","B","C": 1 2 3 1 2 3
  $ date : Date, format: "2010-09-12" "2011-03-13" "2010-01-05" ...
  $ value: int  1 2 3 4 5 6

p <- ggplot(df_muta, aes(x = date, y = value)) + geom_point()

プロットを投稿したかったのですが、まだ 10 の評判がありません。上記の単一のプロットは問題なく、x 軸に日付があります。ファセットしようとすると、x 軸が数値に変換されます。

p + facet_wrap( ~ id)

また、dplyr group_by を使用しようとすると、エラーも発生します。

df_muta %>% group_by(id)
Error: column 'date' has unsupported type

そこで、最初に溶かしてから、日付を変換してみました。

df_melt <- data.frame(
  id = melt(df, id.vars = c("id"), measure.vars = c("date1", "date2"))[[1]],
  date = melt(df, id.vars = c("id"), measure.vars = c("date1", "date2"))[[3]],
  value = melt(df, id.vars = c("id"), measure.vars = c("value1", "value2"))[[3]])
df_melt <- df_melt %>% mutate(date = as.Date(date, format = "%d/%b/%Y"))

str(df_melt)
'data.frame':  6 obs. of  3 variables:
  $ id   : Factor w/ 3 levels "A","B","C": 1 2 3 1 2 3
  $ date : Date, format: "2010-09-12" "2011-03-13" "2010-01-05" ...
  $ value: int  1 2 3 4 5 6

両方のデータ フレームの構造と値はまったく同じように見えますが、この最後のデータ フレームでは、ファセット プロット軸または group_by でエラーが発生しません。バグですか?日付オブジェクトの違いはどこですか?

ありがとう!

4

1 に答える 1