Создайте вектор возрастающих чисел на основе значения другого вектора - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть фрейм данных my_df со следующей информацией:

Id_user Id_log Condition
123     a      day
124     a      day
125     a      night
126     b      day
127     b      day
130     c      night

Я хотел бы создать новый столбец со значениями, основанными на количестве раз, когда Id_log появляется.Например:

Id_user Id_log Condition Id_log_user
123     a      day       1
124     a      day       2
125     a      night     3
126     b      day       1
127     b      day       2
130     c      night     1

Я пытался подсчитать с помощью dplyr функций:

counts_id_log <-my_df%>% group_by (id_log)%>% count (id_log)

counts_id_log выглядит следующим образом:

id_log n
a      3
b      2
c      1

Тогда я могу использовать id_log в качестве вектора, а затем создать вектор возрастающих чисел на основе значения id_log.Например:

x<- counts_id_log$n

На основе x я пытаюсь создать следующий вектор:

y<- c(1,2,3,1,2,1)

После этого я могу добавить вектор y в исходный фрейм данных.Я пробовал что-то rep, но без хороших результатов.Любое предложение будет оценено.Надеюсь, это понятно.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

После того, как вы изменили

library(dplyr)
df%>%group_by(Id_log)%>%mutate(Id_log_user=row_number())
0 голосов
/ 26 февраля 2019

Используйте эту пользовательскую функцию, и она должна делать то, что вы хотите:

CountNumber <- function(x) ave(seq_along(x), x, FUN=seq_along) 
my_df$count <- CountNumber(my_df$Id_log)

Я задавал этот вопрос ранее, и кто-то предоставил мне этот ответ, но я не могу найти оригинал в кредит.

0 голосов
/ 26 февраля 2019

Если я вас правильно понял, вы можете сделать следующее

x <- c(2,2,4,5,1,2,3,5)

unlist(sapply(x, function(x) 1:x))
# [1] 1 2 1 2 1 2 3 4 1 2 3 4 5 1 1 2 1 2 3 1 2 3 4 5

или избежать явного function

unlist(sapply(x, seq, from = 1))

identical(as.numeric(unlist(sapply(x, function(x) 1:x))), y)
#[1] TRUE
...