我正在尝试创建一列用于统计名称数量的列,并且每次从头开始时都从头开始,如下所示:
NAME ID
PIERRE 1
PIERRE 2
PIERRE 3
PIERRE 4
JACK 1
ALEXANDRE 1
ALEXANDRE 2
可复制的数据
structure(list(NAME = structure(c(3L, 3L, 3L, 3L, 2L, 1L, 1L), .Label =
c("ALEXANDRE",
"JACK", "PIERRE"), class = "factor")), class = "data.frame", row.names
= c(NA,
-7L))
答案 0 :(得分:1)
您可以沿着每个组(=名称)中的元素构建一个序列:
ave(1:nrow(df), df$NAME, FUN = seq_along)
或者,如果以后可能再次出现名称,它仍应计为一个新组(=更改名称),例如:
groups <- cumsum(c(FALSE, df$NAME[-1]!=head(df$NAME, -1)))
ave(1:nrow(df), groups, FUN = seq_along)
答案 1 :(得分:0)
使用dplyr
和data.table
:
df %>%
group_by(ID_temp = rleid(NAME)) %>%
mutate(ID = seq_along(ID_temp)) %>%
ungroup() %>%
select(-ID_temp)
或者只是data.table
:
setDT(df)[, ID := seq_len(.N), by=rleid(NAME)]
答案 2 :(得分:0)
这是一种快速的方法。
首先,您可以设置数据:
mydata <- data.frame("name"=c("PIERRE", "ALEX", "PIERRE", "PIERRE", "JACK", "PIERRE", "ALEX"))
接下来,我添加一个1s的虚拟列,该列使解决方案变得不太美观:
mydata$placeholder <- 1
最后,我将占位符列(累加和)加起来,按名称列分组:
mydata$ID <- ave(mydata$placeholder, mydata$name, FUN=cumsum)
由于我以未排序的名称开头,因此我的数据框目前未排序,但是可以通过以下方式解决:
mydata <- mydata[order(mydata$name, mydata$ID),]