按顺序替换数字

时间:2014-01-22 18:10:52

标签: r

我有一个如下所示的数据框:

id  cluster_num  date
a        1        07/31/2000  
b        3        07/31/2000    
b        3        07/31/2000    
c        5        07/31/2000   
d        1        08/31/2000    
e        2        08/31/2000    
e        4        08/31/2000   
f        4        08/31/2000

我想将每个日期的每个cluster_num替换为数字顺序 所以例如第一次约会07/31/2000我希望被替换的数字是1,2,3而不是1,3,5

id  cluster_num  date   
a        1        07/31/2000    
b        2        07/31/2000   
b        2        07/31/2000    
c        3        07/31/2000   
d        1        08/31/2000    
e        2        08/31/2000    
e        3        08/31/2000    
f        3        08/31/2000

我不知道如何做到这一点,任何帮助表示赞赏! 谢谢!

4 个答案:

答案 0 :(得分:3)

根据Josh的错误编辑

如果使用data.table

,这是一个单行班次
## Convert your data. I am assuming original is called 'DF' 
library(data.table)
DT <- data.table(DF)


DT[,cluster_num:=as.integer(as.factor(id)),by=date]

答案 1 :(得分:3)

另一种方法。基于match

transform(dat, cluster_num = ave(cluster_num, date, 
                                 FUN = function(x) match(x, unique(x))))

  id cluster_num       date
1  a           1 07/31/2000
2  b           2 07/31/2000
3  b           2 07/31/2000
4  c           3 07/31/2000
5  d           1 08/31/2000
6  e           2 08/31/2000
7  e           3 08/31/2000
8  f           3 08/31/2000

答案 2 :(得分:2)

如果您的数据已订购,也许您可​​以尝试byrle的组合:

x <- by(mydf$id, mydf$date, FUN=function(x) {
  a <- rle(as.character(x))$lengths
  rep(seq_along(a), a)
})
unlist(x, use.names=FALSE)
# [1] 1 2 2 3 1 2 2 3

将该输出指定为新的“cluster_num”变量。


借用Ricardo和Josh使用的“因子”方法并在基础R中实现它,你也可以使用ave

ave(as.character(mydf$id), mydf$date, FUN = function(x) as.integer(as.factor(x)))

rle方法不同,数据不需要先排序以生成序列。


如果需要根据当前的“cluster_num”生成序列,请在上面的示例中将对“mydf$id”的所有引用更改为“mydf$cluster_num”。

答案 3 :(得分:1)

另一种方法:

在开始之前,您可能需要确保将date列格式化为日期,否则排序可能会失败(检查class(d$date)是否返回Date,而不是{{1 }})。

factor