2

年ごとのイベント発生のデータ セットからタイル プロットを作成したいと思います。たとえば、次のようなデータがあります。

set.seed(123)
data <- data.frame(years = sample(2000:2010, 50, replace = T))

これらを x = year のタイル プロットとしてプロットしたいのですが、倍数が発生する年のイベント間の分離 (y 方向) を維持します。問題は、年の倍数の連続した y 値を提供する他の列がないことです。

説明するために、私はこれを持っています:

data[data$years == 2002, ]
[1] 2002 2002 2002 2002

そして、私はこのようなものが必要だと思います:

data[data$years == 2002, ]
    years   index
1    2002       1
2    2002       2
3    2002       3
4    2002       4

次に、 と で並べて表示できx = yearsますy = index

ご提案ありがとうございます。

4

4 に答える 4

5

多分とplyr

ddply(data, .(years), mutate, index=1:length(years))

これは:

   years index
1   2000     1
2   2000     2
3   2000     3
4   2001     1
5   2001     2
6   2001     3
7   2001     4
8   2001     5
9   2002     1
10  2002     2
11  2002     3
12  2002     4
13  2002     5
于 2013-03-11T14:13:05.967 に答える
3

最初にデータを並べ替えて、次のようyearsに使用aveします。

set.seed(123)
data <- data.frame(years = sample(2000:2010, 50, replace = T))
data <- data[order(data$years), , drop = F]
data$index <- ave(data$years, data$years, FUN=seq_along)

# a piece of output
#    years index
# 6   2000     1
# 18  2000     2
# 35  2000     3
# 15  2001     1
# 30  2001     2
# 41  2001     3
# 45  2001     4
# 46  2001     5
# 17  2002     1
# 38  2002     2
# 40  2002     3
# 47  2002     4
# 49  2002     5

編集:次aveのようにソートする最初の行をスキップするだけで、ソートせずに実行することもできます:

set.seed(123)
data <- data.frame(years = sample(2000:2010, 50, replace = T))
data$index <- ave(data$years, data$years, FUN=seq_along)
> head(data)

#   years index
# 1  2003     1
# 2  2008     1
# 3  2004     1
# 4  2009     1
# 5  2010     1
# 6  2000     1

順序が保持されることに注意してください。をサブセット化すると、次のようになり2002ます。

data[data$years == 2002, ]

#    years index
# 17  2002     1
# 38  2002     2
# 40  2002     3
# 47  2002     4
# 49  2002     5
于 2013-03-11T14:35:23.023 に答える
2

最もエレガントではないかもしれません..それを行う別の方法を追加するだけです。

set.seed(123)
data <- data.frame(years = sample(2000:2010, 50, replace = T))
cbind(data[order(data), ], unlist(sapply(rle(data[order(data), ])$lengths, FUN = seq)))
##       [,1] [,2]
##  [1,] 2000    1
##  [2,] 2000    2
##  [3,] 2000    3
##  [4,] 2001    1
##  [5,] 2001    2
##  [6,] 2001    3
##  [7,] 2001    4
##  [8,] 2001    5
##  [9,] 2002    1
## [10,] 2002    2
## [11,] 2002    3
## [12,] 2002    4
## [13,] 2002    5
## [14,] 2003    1
## [15,] 2003    2
## [16,] 2003    3
## [17,] 2003    4
## [18,] 2004    1
## [19,] 2004    2
## [20,] 2004    3
## [21,] 2004    4
## [22,] 2004    5
## [23,] 2005    1
## [24,] 2005    2
## [25,] 2005    3
## [26,] 2005    4
## [27,] 2005    5
## [28,] 2006    1
## [29,] 2006    2
## [30,] 2006    3
## [31,] 2007    1
## [32,] 2007    2
## [33,] 2007    3
## [34,] 2007    4
## [35,] 2007    5
## [36,] 2007    6
## [37,] 2008    1
## [38,] 2008    2
## [39,] 2008    3
## [40,] 2009    1
## [41,] 2009    2
## [42,] 2009    3
## [43,] 2009    4
## [44,] 2009    5
## [45,] 2009    6
## [46,] 2010    1
## [47,] 2010    2
## [48,] 2010    3
## [49,] 2010    4
## [50,] 2010    5

** Arunの提案によると、以下はさらに簡単です。

cbind(data[order(data), ],sequence(rle(data[order(data), ])$lengths))
于 2013-03-11T14:11:55.987 に答える
1

ここでの共有の精神で、ベース R でこれを行う別の方法があります。

stack(with(data, by(years, years, FUN = seq_along)))

最初の数行は次のとおりです。

> head(stack(with(data, by(years, years, FUN = seq_along))), 10)
   values  ind
1       1 2000
2       2 2000
3       3 2000
4       1 2001
5       2 2001
6       3 2001
7       4 2001
8       5 2001
9       1 2002
10      2 2002

さらに言えば、次のような分割-適用-結合アプローチのいずれかがおそらく適切です。

stack(sapply(split(data$years, data), seq_along))
stack(tapply(data$years, data$years, FUN = seq_along))

ただし、@Arun のaveソリューションと @juba の「plyr」ソリューションは、複数列のデータセットに列を追加するのに、これらよりも柔軟性が高いという理由だけで、はるかに適切です。

于 2013-03-11T16:29:37.397 に答える