计算列中的值,然后重置

时间:2018-10-21 11:51:59

标签: r

我正在尝试创建一列用于统计名称数量的列,并且每次从头开始时都从头开始,如下所示:

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))

3 个答案:

答案 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)

使用dplyrdata.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),]