У меня есть данные, где участники могут иметь несколько точек данных в день в течение четырех дней.Я ищу, чтобы перекодировать каждый соответствующий день со значением 1-4.Это может быть примером подмножества моих данных:
my.df <- read.table(text="
ID Date Variable
1 0401 9
1 0402 2
1 0403 5
1 0404 8
2 0402 1
2 0402 9
2 0403 0
2 0404 3
2 0405 2
2 0405 1", header=TRUE)
> dput(my.df)
structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L),
Date = c(401L, 402L, 403L, 404L, 402L, 402L, 403L, 404L, 405L,
405L), Variable = c(9L, 2L, 5L, 8L, 1L, 9L, 0L, 3L, 2L, 1L
)), .Names = c("ID", "Date", "Variable"), class = "data.frame",
row.names = c(NA, -10L))
Это мой желаемый вывод:
ID Date Variable DateRecode
1 0401 9 1
1 0402 2 2
1 0403 5 3
1 0404 8 4
2 0402 1 1
2 0402 9 1
2 0403 0 2
2 0404 3 3
2 0405 2 4
2 0405 1 4", header=TRUE)
Я подумал, что мне нужно использовать функцию задержки для создания столбца DateRecode, потому что тамдесятки участников реального набора данных.
Я могу сгенерировать столбец задержки, используя dplyr:
library(dplyr)
my.df <-
my.df %>%
group_by(ID) %>%
mutate(lag.value = dplyr::lag(Date, n = 1, default = NA))
Но это, конечно, не говорит R, чтобы что-то перекодировать.
Логика, по сути, мне нужна: при группировании по ID, если значение Date равно первому / самому низкому значению Date, тогда создайте новый столбец со значением 1. Для каждого последующегоrow, если Date совпадает со значением предыдущей строки, то 1, если нет, то добавьте 1.
IF-операторы для меня пока еще не сработали.Мне не удалось найти способ объяснить тот факт, что у каждого участника даты отличаются от даты последнего, поэтому я надеялся, что будет решение, использующее лаг.
Есть ли у кого-нибудь какие-либо предложения о том, как яможет пойти на это?Я почесал голову от этого уже несколько дней.Заранее спасибо!