为R中的相同值添加一列索引

为R中的相同值添加一列索引,r,R,我想从一个数据集中绘制一个平铺图,我每年都有事件发生。例如,我有如下数据: set.seed(123) data <- data.frame(years = sample(2000:2010, 50, replace = T)) data[data$years == 2002, ] years index 1 2002 1 2 2002 2 3 2002 3 4 2002 4 我想我需要这样的东西: s

我想从一个数据集中绘制一个平铺图,我每年都有事件发生。例如,我有如下数据:

set.seed(123)
data <- data.frame(years = sample(2000:2010, 50, replace = T))
data[data$years == 2002, ]
    years   index
1    2002       1
2    2002       2
3    2002       3
4    2002       4
我想我需要这样的东西:

set.seed(123)
data <- data.frame(years = sample(2000:2010, 50, replace = T))
data[data$years == 2002, ]
    years   index
1    2002       1
2    2002       2
3    2002       3
4    2002       4
然后我可以用
x=years
y=index
平铺


谢谢你的建议

可能不是最优雅的。。只是增加了另一种方法

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

可能使用
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

我首先按
年份对数据进行排序
,并使用
平均值
,如下所示:

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
请注意,现在保留了顺序。现在,如果我们为
2002
创建子集:

data[data$years == 2002, ]

#    years index
# 17  2002     1
# 38  2002     2
# 40  2002     3
# 47  2002     4
# 49  2002     5

本着分享的精神,这里有另一种在base 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”解决方案比这些解决方案更适合将列添加到多列数据集中,如果只是因为它们的灵活性的话。

只是好奇:为什么要先对数据排序?这样我就对数据进行了排序。它与
ave
(在编辑下再次显示)无关。(1)非常方便的功能
mutate
<代码>连续(年)更好…?这太棒了。我试着使用
ddply
,但还没弄明白。可耻的是,我正在参加Coursera的数据分析课程,并记得其中一次讲座中的一些神奇功能,我想,“哇,我从来都不知道这一点。那会很方便的。”现在它出现了。。。事后看来,这确实是一个循序渐进的过程!谢谢你的回答!我应该补充一句:当其他人完成这项工作时,我认为这项工作是优雅和值得纪念的。虽然有一些方法可以使用base R,但我认为在实际使用中,有效地记住语法肯定是有意义的。nice(+1),这可以通过使用
sequence
简化为:
sequence(rle(data[order(data)))$length)
??
stack(sapply(split(data$years, data), seq_along))
stack(tapply(data$years, data$years, FUN = seq_along))