根据ID在R中分配标签?

时间:2015-01-14 10:14:25

标签: r

我的数据框如下:

DF<-data.frame(a=c(1,1,1,2,2,2,3,3,4,4),b=c(43,23,45,65,43,23,65,76,87,4))

a  b
1 43
1 23
1 45
2 65
2 43
2 23
3 65
3 76
4 87
4  4

我想设置一个这样的标志:

a  b flag
1 43 A
1 23 B
1 45 C
2 65 A
2 43 B
2 23 C
3 65 A
3 76 B
4 87 A
4  4 B

如何在R中完成此操作?

2 个答案:

答案 0 :(得分:4)

使用dplyr

library(dplyr)
DF %>% group_by(a) %>% mutate(flag=LETTERS[row_number()])

使用data.table(HT to @David Arenberg)

library(data.table)
setDT(DF)[, flag := LETTERS[1:.N], a]   

很快成为老式解决方案(由@RomanLuštrik提供)

do.call("c", sapply(rle(DF$a)$lengths, FUN = function(x) LETTERS[1:x]))

<强>附录

@akrun建议在对LETTERS进行扩展以解决当前问题时出现“如果有超过26个组怎么办?” (@James)

Let <- unlist(sapply(1:3, function(i) do.call(paste0,expand.grid(rep(list(LETTERS),i)))))

LETTERS替换为Let时,以上所有代码仍然完全正常运行。

答案 1 :(得分:2)

我将在基地R中再投入一次:

transform(DF, flag = LETTERS[ave(a,a,FUN=seq_along)])