1

Let's say I have the following dataframe:

ID <- c(15, 25, 90, 1, 23, 543)

animal <- c("fish", "dog", "fish", "cat", "dog", "fish")

df <- data.frame(ID, animal)

How could I create a third column to represent the instance (from top to bottom) that a repeat animal appears? for example, a column "Instance" in the order (1, 1, 2, 1, 2, 3)? I know I can use group_by to receive the total count, but this is not exactly what I'm after. Thanks.

Andrea
  • 607
  • 8
  • 21

1 Answers1

0

You need row_number() by groups of animal.

library(dplyr)

df %>%
  mutate(Instance = row_number(), .by = animal)

#    ID animal Instance
# 1  15   fish        1
# 2  25    dog        1
# 3  90   fish        2
# 4   1    cat        1
# 5  23    dog        2
# 6 543   fish        3

With built-in packages, you can use ave:

ave(df$animal, df$animal, FUN = seq)

# [1] "1" "1" "2" "1" "2" "3"
Darren Tsai
  • 32,117
  • 5
  • 21
  • 51