我有一个如下所示的数据框:
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
我不知道如何做到这一点,任何帮助表示赞赏! 谢谢!
答案 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)
如果您的数据已订购,也许您可以尝试by
和rle
的组合:
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