0

plyrパッケージのddplyを使用して、日付ごとの行数を取得しています。ただし、値のない日付がある場合、それらは無視され、特定の日付が存在しないデータフレームになります。ddplyによって生成された値を使用してプロットを生成し、存在しなかったすべての日付を含めて、それらに0のnrow値を与える方法を見つけたいと思いました。

library(plyr)
f = ddply(df, .(created), "nrow")
f = as.data.frame(f)

> head(f)
     created nrow
1 2009-12-29    2
2 2009-12-30    3
3 2010-01-06    1
4 2010-01-07    2
5 2010-01-08    2
6 2010-01-11    1

折れ線グラフを適切に作成するために、すべての日付(nrow値が0の日付)が必要です。したがって、上記のセグメントでは、「2010-01-01」から「2010-01-05」などの欠落しているすべての日付を追加し、それぞれに9のnrow値を指定します。これを実行するためのエレガントな方法を提案することはできません。タスク。

ggplot(f, aes(x=created, y=nrow)) + 
  geom_line(size=0.6, color="darkgreen") +
  labs(title="Plot") +
  theme(axis.text.y=element_text(family="sans", face="bold"),  
        axis.text.x=element_text(family="sans", face="bold"))  

ddplyの.dropコマンドがこのタスクを実行したと思いましたが、そうではないようです。

編集:

サンプルデータ。

mdf=data.frame(created=c('2009-12-29','2009-12-30','2010-01-06','2010-01-07',
                     '2010-01-08','2010-01-11','2009-12-29','2009-12-30'))

ddply(mdf, .(created), .drop=FALSE, "nrow")



    created nrow
1 2009-12-29    2
2 2009-12-30    2
3 2010-01-06    1
4 2010-01-07    1
5 2010-01-08    1
6 2010-01-11    1

「2010-01-01」、「2010-01-02」などをnrowの値0に含めるにはどうすればよいですか。

4

3 に答える 3

4

適切なクラスのオブジェクトを使用する

プロットが必要なので、クラス「Date」として日付を指定するだけで十分です。

# Load libraries
library(package=plyr)
library(package=ggplot2)

# Create data
mdf <- data.frame(created=c('2009-12-29','2009-12-30','2010-01-06','2010-01-07',
                     '2010-01-08','2010-01-11','2009-12-29','2009-12-30'))
mdf$created <- as.Date(mdf$created)

# Plot with variable of class "Date"
ggplot(mdf, aes(x=created)) + 
  geom_line(size=0.6, color="darkgreen", stat='bin', binwidth=1) +
  labs(title="Plot") +
  theme(axis.text.y=element_text(family="sans", face="bold"),  
        axis.text.x=element_text(family="sans", face="bold"))

ここに画像の説明を入力してください

于 2013-02-24T02:11:59.987 に答える
3

簡単な方法は、次の結果のと をdata.frame使用して、すべての日付で別の日付を作成することです。minmaxddply

# dummy data.frame
set.seed(45)
dates <- seq(as.Date("2013-01-01"), as.Date("2013-03-31"), by=3)
df <- data.frame(created=sample(dates, 100, replace=T))
# your plyr result
require(plyr)
df.r <- ddply(df, .(created), nrow) # 30 * 2

# solution:
df2 <- data.frame(created = seq(min(df.r$created), max(df.r$created), by=1), V1 = 0)
idx <- match(df2$created, df.r$created)
df2$V1[!is.na(idx)] <- df.r$V1[idx[!is.na(idx)]]

これで、で欠落していた日付のdf2すべての日付が含まれるようになります。これが「エレガント」かどうかはわかりませんが!0'sdf.r

于 2013-02-24T00:39:44.667 に答える
3

すべての日付(シーケンス)を含むリストを事前に作成してから、テーブルの日付とマージすることができます。これにより、元のデータにNAが挿入されます。

dd <- ddply(mdf,.(created),nrow)
df.miss <- data.frame(created=seq.Date(min(dd$created),max(dd$created),1))
dat <- merge(dd,df.miss,all.y=T)
dat[is.na(dat)] <- 0  ## I replace NA by 0 here

今、私は自分のデータをプロットします

library(lattice)
xyplot(V1~created,data=dat, type=c('l','p'),cex=2,lty=2)

ここに画像の説明を入力してください

于 2013-02-24T02:23:52.447 に答える