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然后我可以用and平铺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 回答