在 R 数据框中为每组变量值添加行号

Add line numbers per group of variable values in R dataframe

我有一个这样的 R 数据框:

blogger; date; word
joe; 2016-11-19; ears
paul; 2017-04-02; dilapidated
joe; 2016-11-21; night
joe; 2016-11-20; girl
paul; 2017-04-01; crumpled
paul; 2017-04-03; bellow

我想先按 blogger 排序,然后再按 date 排序。然后,我想为每个博主添加一个包含行号的列。

我有这个:

# make linenumbers
df <- df %>%
    arrange(blogger,date) %>%
    mutate(linenumber = row_number())

但这显然不是从每个博主的第 1 行开始的。我得到的输出是:

blogger; date; word; linenumber
joe; 2016-11-19; ears; 1
joe; 2016-11-20; girl; 2
joe; 2016-11-21; night; 3
paul; 2017-04-01; crumpled; 4
paul; 2017-04-02; dilapidated; 5
paul; 2017-04-03; bellow; 6

但我想要的输出是:

blogger; date; word; linenumber
joe; 2016-11-19; ears; 1
joe; 2016-11-20; girl; 2
joe; 2016-11-21; night; 3
paul; 2017-04-01; crumpled; 1
paul; 2017-04-02; dilapidated; 2
paul; 2017-04-03; bellow; 3

在博客上尝试 group_by

df %>% arrange(blogger, date) %>% 
group_by(blogger) %>% 
mutate(linenumber = row_number()) %>%
ungroup()

如果不需要对行进行排序,您可以这样做:

d$linenumber <- ave(as.integer(d$blogger), d$blogger, FUN=seq_along)
# > d
#   blogger        date         word linenumber
# 1     joe  2016-11-19         ears          1
# 2    paul  2017-04-02  dilapidated          1
# 3     joe  2016-11-21        night          2
# 4     joe  2016-11-20         girl          3
# 5    paul  2017-04-01     crumpled          2
# 6    paul  2017-04-03       bellow          3

数据:

d <- read.table(header=TRUE, sep=';', text=
"blogger; date; word
joe; 2016-11-19; ears
paul; 2017-04-02; dilapidated
joe; 2016-11-21; night
joe; 2016-11-20; girl
paul; 2017-04-01; crumpled
paul; 2017-04-03; bellow")

我们可以使用 data.table

中的便捷函数 (rowid) 来做到这一点
library(data.table)
setDT(d)[, linenumber := rowid(blogger)]
d   
#   blogger        date         word linenumber
#1:     joe  2016-11-19         ears          1
#2:    paul  2017-04-02  dilapidated          1
#3:     joe  2016-11-21        night          2
#4:     joe  2016-11-20         girl          3
#5:    paul  2017-04-01     crumpled          2
#6:    paul  2017-04-03       bellow          3