R使用滞后重新编码变量

时间:2018-06-08 03:42:28

标签: r

我有数据,参与者可以在四天内每天获得多个数据点。我希望每个值都重新编码为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的新列。对于每个后续行,如果Date与上一行的值相同,则为1,否则为1,然后添加1.

IF语句对我来说也没有用。我一直无法想办法说明每个参与者的日期都不同于最后一个,所以我希望有一个使用滞后的解决方案。

有没有人对我如何做到这一点有任何建议?我现在已经在这个问题上摸不着头几天了。提前谢谢!

2 个答案:

答案 0 :(得分:0)

我们可以使用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

注意:这里的日期&#39;一切顺利。如果不是,请执行arrange,然后执行group_by

my.df %>%
   arrange(ID, Date) %>%
   group_by(ID) %>%
   mutate(lag.value = match(Date, unique(Date)))

答案 1 :(得分:0)

在基数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