我的数据框如下:
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中完成此操作?
答案 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)])