R中使用group_indices或类似的特定于组的ID号

时间:2018-04-10 15:37:02

标签: r dplyr

我试图用两列对一系列观察进行分组,然后创建一个带有id号的第三列。我已尝试group_indices,但这会给每个观察组合一个唯一的数字。我想要将数字恢复为1,以便对每组进行第一次观察。

在我的数据中,有一系列Sites,其中有多行显示收集观察时的日历Day。我想计算 a Site的时间顺序日。

library(dplyr)

# Make some data
df <- data.frame(Site = rep(c("A", "B", "C"), each = 70),
            Day = as.integer(rep(c(21,22,23,24,25,26,27,1,2,3,4,5,6,7,
                      24,25,26,27,28,29,30), each = 10)))

# Create Day Number column (this doesn't actually work, but is the sort
# of thing I'm looking for...)
df <- df %>% group_by(Site, Day) %>% 
                mutate(Day.Number = group_indices(Day))

# Desired output
     Site Day Day.Number
1      A  21     1
2      A  21     1
3      A  21     1
...
11     A  22     2
12     A  22     2
13     A  22     2
14     A  22     2
15     A  22     2
...
141    C  24     1
142    C  24     1
143    C  24     1
144    C  24     1
...
151    C  25     2
152    C  25     2
153    C  25     2
154    C  25     2
155    C  25     2
...

这只是一个展示问题的玩具数据集。虽然大多数sites将有七个days的十个观察值,但它并不总是给定的,因此我不能仅使用rep()等序列。

在github herehere上对此进行了一些讨论,但似乎并没有得到解决。任何有关变通方法的建议都非常感谢。

1 个答案:

答案 0 :(得分:3)

这是一种方法:

df <- df %>% 
        left_join(unique(df) %>% group_by(Site) %>% mutate(Day.Number=1:n()))

head(df)
#   Site Day Day.Number
# 1    A  21          1
# 2    A  21          1
# 3    A  21          1
# 4    A  21          1
# 5    A  21          1
# 6    A  21          1