我有一个跨越一个月的大数据集,数据标记在一个名为txn_date
的列中,如下所示。(这是它的玩具复制品(
dat1 <- read.table(text = "var1 txn_date
5 2020-10-25
1 2020-10-25
3 2020-10-26
4 2020-10-27
1 2020-10-27
3 2020-10-31
3 2020-11-01
8 2020-11-02 ", header = TRUE)
理想情况下,我想在数据框中为数据中的每个日期获取一列,我认为可以通过首先为出现的第一个日期获取一个1的列来完成,然后以此类推
所以像这个
dat1 <- read.table(text = "var1 txn_date day
5 2020-10-25 1
1 2020-10-25 1
3 2020-10-26 2
4 2020-10-27 3
1 2020-10-27 3
3 2020-10-31 7
3 2020-11-01 8
8 2020-11-12 9 ", header = TRUE
我不太清楚怎么弄到这个。txn_date
列是我实际数据帧中的as.Date
。我想,如果我能得到上面列出的单个day
列(然后将其转换为因子(,那么如果需要的话,我总是可以对该列的实际水平进行一次热编码。最终,我需要将实验当天作为我要运行的回归中的回归器。
类似y ~ x + day_1 + day_2 +...+ error
的东西
这样合适吗?
library(tidyverse)
dat1 <- read.table(text = "var1 txn_date
5 2020-10-25
1 2020-10-25
3 2020-10-26
4 2020-10-27
1 2020-10-27
3 2020-10-31
3 2020-11-01
8 2020-11-02 ", header = TRUE)
dat1$txn_date <- as.Date(dat1$txn_date)
dat1 %>%
mutate(days = txn_date - txn_date[1] + 1)
# var1 txn_date days
#1 5 2020-10-25 1 days
#2 1 2020-10-25 1 days
#3 3 2020-10-26 2 days
#4 4 2020-10-27 3 days
#5 1 2020-10-27 3 days
#6 3 2020-10-31 7 days
#7 3 2020-11-01 8 days
#8 8 2020-11-02 9 days
我们基于'txn_date'和match
的min
和max
创建一个日期序列
dates <- seq(min(as.Date(dat1$txn_date)),
max(as.Date(dat1$txn_date)), by = '1 day')
dat1$day <- with(dat1, match(as.Date(txn_date), dates))
dat1$day
#[1] 1 1 2 3 3 7 8 9
或者可以使用factor
路由
with(dat1, as.integer(factor(txn_date, levels = as.character(dates))))
#[1] 1 1 2 3 3 7 8 9