我想弄清楚这个......
我有这个数据集:
id date
1 1 2016-01-01
2 1 2016-01-01
3 1 2016-01-02
4 2 2016-01-01
5 2 2016-01-03
6 2 2016-01-04
7 3 2016-01-01
8 3 2016-01-05
9 3 2016-01-05
所以我试图通过以下方式使用dplyr:
transformed <- data %>% group_by(id) %>% transform(., flag=match(date, unique(date)))
我得到了这个:
id date flag
1 1 2016-01-01 1
2 1 2016-01-01 1
3 1 2016-01-02 2
4 2 2016-01-01 1
5 2 2016-01-03 3
6 2 2016-01-04 4
7 3 2016-01-01 1
8 3 2016-01-05 5
9 3 2016-01-05 5
但我的目标是,
id date flag
1 1 2016-01-01 1
2 1 2016-01-01 1
3 1 2016-01-02 2
4 2 2016-01-01 1
5 2 2016-01-03 2
6 2 2016-01-04 3
7 3 2016-01-01 1
8 3 2016-01-05 2
9 3 2016-01-05 2
从第一眼看,transform
似乎没有识别出管道命令。 ids遵循日期顺序。
如何使用dplyr实现此目的?对于as.character
或as.Date
的日期,它不起作用。
答案 0 :(得分:1)
您可以使用以下内容:
library(dplyr)
df %>%
group_by(id) %>%
#convert the date into a factor and then into numeric
#which will give you what you need
mutate(flag = as.numeric(as.factor(date)))
输出:
Source: local data frame [9 x 3]
Groups: id [3]
id date flag
<int> <chr> <dbl>
1 1 2016-01-01 1
2 1 2016-01-01 1
3 1 2016-01-02 2
4 2 2016-01-01 1
5 2 2016-01-03 2
6 2 2016-01-04 3
7 3 2016-01-01 1
8 3 2016-01-05 2
9 3 2016-01-05 2
答案 1 :(得分:1)
我们可以使用data.table
library(data.table)
setDT(df1)[, flag := match(date, unique(date)), by = id]