为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))