我有数据,参与者可以在四天内每天获得多个数据点。我希望每个值都重新编码为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语句对我来说也没有用。我一直无法想办法说明每个参与者的日期都不同于最后一个,所以我希望有一个使用滞后的解决方案。
有没有人对我如何做到这一点有任何建议?我现在已经在这个问题上摸不着头几天了。提前谢谢!
答案 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)
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