R:在日期中使用doBy



我正在R中进行一些编码。我试图使用doBy包来获得变量(x(的date(date(和id(id(的总和总分。doBy命令运行良好,我得到了这个输出。

data
id date       x
1  01/01/2021 1
1  01/02/2021 2
1  01/03/2021 3
2  02/01/2021 2
2  02/02/2021 3
2  02/02/2021 4
3  03/11/2021 3
3  03/12/2021 3
3  03/13/2021 2

我想重新编码日期,这样每个人的第一个按时间顺序排列的日期1是1,第二个按时间排序的日期是2,第三个按时间排列的日期是3,等等。我希望我的日期看起来像这样。

data2
id daycount x
1  1        1
1  2        2
1  3        3
2  1        2
2  2        3
2  3        4
3  1        3
3  2        3
3  3        2

我可以使用order((来安排日期,但我不知道如何匹配日期。我想我需要某种序列号或自动编号。此外,一些参与者可能有不同的天数。一些参与者可能有1天的时间,而其他参与者可能有10天的时间。

1(doBy假设日期已经在id:中排序

library(doBy)
transform_by(data, ~ id, countdays = seq_along(id))

给予:

id       date x countdays
1  1 01/01/2021 1         1
2  1 01/02/2021 2         2
3  1 01/03/2021 3         3
4  2 02/01/2021 2         1
5  2 02/02/2021 3         2
6  2 02/02/2021 4         3
7  3 03/11/2021 3         1
8  3 03/12/2021 3         2
9  3 03/13/2021 2         3

2(基本R也可以使用基本R中的变换和ave来完成。

transform(data, daycount = ave(id, id, FUN = seq_along))

给予:

id       date x daycount
1  1 01/01/2021 1        1
2  1 01/02/2021 2        2
3  1 01/03/2021 3        3
4  2 02/01/2021 2        1
5  2 02/02/2021 3        2
6  2 02/02/2021 4        3
7  3 03/11/2021 3        1
8  3 03/12/2021 3        2
9  3 03/13/2021 2        3

备注

可复制形式的data

Lines <- "id date       x
1  01/01/2021 1
1  01/02/2021 2
1  01/03/2021 3
2  02/01/2021 2
2  02/02/2021 3
2  02/02/2021 4
3  03/11/2021 3
3  03/12/2021 3
3  03/13/2021 2"
data <- read.table(text = Lines, header = TRUE)

您可能希望通过id使用group_by,然后使用rankdense_rank创建一个新列(请注意它们在处理重复项时的区别(。

为了重新创建您的数据,我使用了:

# recreate data frame
id_vec <- rep(c(1,2,3), each = 3)
date_vec <- c(
'01/01/2021',
'01/02/2021',
'01/03/2021',
'02/01/2021',
'02/02/2021',
'02/02/2021',
'03/11/2021',
'03/12/2021',
'03/13/2021' 
)
x_vec <- rep(c(1,2,3), times = 3)
data <- data.frame(id = id_vec, date = date_vec, x = x_vec)

为了方便起见,我还将data列转换为实际日期格式:

# convert string to date object
library(lubridate)
library(dplyr)
data <- data %>% mutate(date_formatted = mdy(date)) 

使用rank:创建列

data %>%
group_by(id) %>%
mutate(day_count = rank(date_formatted, ties.method = "first")) %>%
ungroup()
# # A tibble: 9 x 5
# id date           x date_formatted day_count
# <dbl> <chr>      <dbl> <date>             <int>
# 1     1 01/01/2021     1 2021-01-01             1
# 2     1 01/02/2021     2 2021-01-02             2
# 3     1 01/03/2021     3 2021-01-03             3
# 4     2 02/01/2021     1 2021-02-01             1
# 5     2 02/02/2021     2 2021-02-02             2
# 6     2 02/02/2021     3 2021-02-02             3
# 7     3 03/11/2021     1 2021-03-11             1
# 8     3 03/12/2021     2 2021-03-12             2
# 9     3 03/13/2021     3 2021-03-13             3

使用dense_rank:创建新列

data %>%
group_by(id) %>%
mutate(day_count = dense_rank(date_formatted)) %>%
ungroup()
# # A tibble: 9 x 5
# id date           x date_formatted day_count
# <dbl> <chr>      <dbl> <date>             <int>
# 1     1 01/01/2021     1 2021-01-01             1
# 2     1 01/02/2021     2 2021-01-02             2
# 3     1 01/03/2021     3 2021-01-03             3
# 4     2 02/01/2021     1 2021-02-01             1
# 5     2 02/02/2021     2 2021-02-02             2
# 6     2 02/02/2021     3 2021-02-02             2
# 7     3 03/11/2021     1 2021-03-11             1
# 8     3 03/12/2021     2 2021-03-12             2
# 9     3 03/13/2021     3 2021-03-13             3

相关内容

  • 没有找到相关文章

最新更新