3

データセット内の個別のIDごとに作成されたrle()クラスオブジェクトがあり、それらの分布を把握するために、さまざまな長さのクラスの頻度を表示する個別のヒストグラムにプロットしたいのですが、できます。これを行う方法を理解しているようです。

次のコードを使用して、さまざまなIDのデータに対してrle()関数を実行することにより、rle()クラスオブジェクトのリストを取得しました。

list.runs<-dlply(data.1, .(ID), function(x) rle(x$flights))

ただし、これにより、rle()オブジェクトをデータフレームに強制変換できなかったため、データをデータフレームに転送できなくなりました。したがって、私はそれらを分類解除しました:

list.runs<-dlply(data.1, .(ID), function(x) unclass(rle(x$flights)))

ただし、リストの長さが異なるため、このデータをデータフレームに入れることはできません。

runs<-ldply(do.call(data.frame,list.runs))

Error in function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
arguments imply differing number of rows: 14, 13

質問:個別のIDごとに長さの値のヒストグラムをプロットするにはどうすればよいですか?

データ(簡略化):

> dput(data.1)
structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), flights = c(1, 1, 1, 
1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 
0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 
1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 
1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 
1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1)), .Names = c("ID", "flights"
), row.names = c(NA, -100L), class = "data.frame")
4

2 に答える 2

6

あなたが何をしようとしているのかわかりませんが、ここではその方法を説明します。

require(plyr)
list.runs <- ddply(data.1, .(ID), function(x) {
    rr <- rle(x$flights)
    data.frame(freq=rr$lengths, xvar=seq_along(rr$lengths))
})

require(ggplot2)
ggplot(data = list.runs, aes(x = factor(xvar), y = freq)) + 
        geom_bar(stat = "identity", aes(fill=factor(ID))) + 
          facet_wrap( ~ ID, ncol=2)

あなたにあげる:

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

編集: OPのコメントに続いて:あなたはこのデータから直接それを得ることができます。実際、要件に合わせて「xvar」を生成する必要はありません。差出人list.runs

ggplot(data = list.runs, aes(x = factor(freq))) + 
     geom_bar(aes(weights = ..count.., fill=factor(ID))) + 
     facet_wrap( ~ ID, ncol=2)

与える:

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

于 2013-03-12T14:14:22.737 に答える
1

呼び出しでdata.frameに直接移動する@Arunの方法は進むべき道だと思いますが、オブジェクトから有用なdata.frameにddply移動する方法の1つの方法を示すだけです。list.runs

df.summary <- ldply(list.runs,function(x,...) do.call(data.frame,x))

library(ggplot2)
ggplot(df.summary, aes(factor(lengths),values)) + 
  geom_bar(stat = "identity", aes(fill=factor(ID))) + 
  facet_grid( ~ ID, ncol=2)

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

于 2013-03-12T14:20:24.003 に答える