R Перекодировать переменные, используя лаг - PullRequest
0 голосов
/ 08 июня 2018

У меня есть данные, где участники могут иметь несколько точек данных в день в течение четырех дней.Я ищу, чтобы перекодировать каждый соответствующий день со значением 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-операторы для меня пока еще не сработали.Мне не удалось найти способ объяснить тот факт, что у каждого участника даты отличаются от даты последнего, поэтому я надеялся, что будет решение, использующее лаг.

Есть ли у кого-нибудь какие-либо предложения о том, как яможет пойти на это?Я почесал голову от этого уже несколько дней.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

в базе R, вы можете сделать:

 transform(my.df,lag.value=ave(Date,ID,FUN=factor))
   ID Date Variable lag.value
1   1  401        9         1
2   1  402        2         2
3   1  403        5         3
4   1  404        8         4
5   2  402        1         1
6   2  402        9         1
7   2  403        0         2
8   2  404        3         3
9   2  405        2         4
10  2  405        1         4
0 голосов
/ 08 июня 2018

Мы можем сделать это с помощью match

library(dplyr)
my.df %>% 
   group_by(ID) %>% 
   mutate(lag.value = match(Date, unique(Date)))
# A tibble: 10 x 4
# Groups:   ID [2]
#      ID  Date Variable lag.value
#   <int> <int>    <int>     <int>
# 1     1   401        9         1
# 2     1   402        2         2
# 3     1   403        5         3
# 4     1   404        8         4
# 5     2   402        1         1
# 6     2   402        9         1
# 7     2   403        0         2
# 8     2   404        3         3
# 9     2   405        2         4
#10     2   405        1         4

Или используйте factor и приведите его к integer

my.df  %>%
  group_by(ID) %>%
  mutate(lag.value = as.integer(factor(Date)))

Или другому вариантуgroup_indices

library(purrr)
my.df %>% 
  split(.$ID) %>%
  map_df(~ .x %>% mutate(lag.value = group_indices(., Date)))
#   ID Date Variable lag.value
#1   1  401        9         1
#2   1  402        2         2
#3   1  403        5         3
#4   1  404        8         4
#5   2  402        1         1
#6   2  402        9         1
#7   2  403        0         2
#8   2  404        3         3
#9   2  405        2         4
#10  2  405        1         4

ПРИМЕЧАНИЕ. Здесь «Дата» в порядке.Если это не так, тогда выполните arrange, затем выполните group_by

my.df %>%
   arrange(ID, Date) %>%
   group_by(ID) %>%
   mutate(lag.value = match(Date, unique(Date)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...