Ответ 1
Попробуйте следующее:
dataset <- data.frame(out = c("a","b","c","a","d","b","c","a","d","b","c","a"))
with(dataset, ave(as.character(out), out, FUN = seq_along))
# [1] "1" "1" "1" "2" "1" "2" "2" "3" "2" "3" "3" "4"
Конечно, вы можете назначить вывод столбцу в data.frame
, используя что-то вроде out$asNumbers <- with(dataset, ave(as.character(out), out, FUN = seq_along))
Update
Подход "dplyr" тоже довольно приятный. Логика очень похожа на подход "data.table". Преимущество состоит в том, что вам не нужно обертывать вывод с помощью as.numeric
, который требуется с помощью подхода ave
, упомянутого выше.
dataset %>% group_by(out) %>% mutate(count = sequence(n()))
# Source: local data frame [12 x 2]
# Groups: out
#
# out count
# 1 a 1
# 2 b 1
# 3 c 1
# 4 a 2
# 5 d 1
# 6 b 2
# 7 c 2
# 8 a 3
# 9 d 2
# 10 b 3
# 11 c 3
# 12 a 4
Третий вариант - использовать getanID
из моего пакета splitstackshape. Для этого конкретного примера вам просто нужно указать имя data.frame
(так как это один столбец), однако, как правило, вы были бы более конкретными и упоминали столбец (столбцы), которые в настоящее время служат как "идентификаторы", а функция будет проверять, являются ли они уникальными или нужна ли кумулятивная последовательность, чтобы сделать их уникальными.
library(splitstackshape)
# getanID(dataset, "out") ## Example of being specific about column to use
getanID(dataset)
# out .id
# 1: a 1
# 2: b 1
# 3: c 1
# 4: a 2
# 5: d 1
# 6: b 2
# 7: c 2
# 8: a 3
# 9: d 2
# 10: b 3
# 11: c 3
# 12: a 4