R - 将日期值转换为正整数
R - Turn date values into positive integers
希望有人能指出我的具体问题的解决方案。
假设我有一个数据框,在 A 列中我有格式为 (YYYY-MM-DD, POSIXct) 的日期,它们介于一些起点和终点之间(即 2017/01/01 到 2018/01/01 ).在 B 列中,我有一个项目列表,在 C 列中,我有一个项目在 A 中给出的日期的数量。此外,我想添加一个假设,尽管 A 列 运行 中的日期在已知开始之间和结束日期,并按顺序排列,它们不一定由相等的时间间隔分隔。示例可能如下所示:
+------------+-------+----------+
| Date | Item | Quantity |
+------------+-------+----------+
| 2017/01/01 | Beans | 2 |
| 2017/01/01 | Pens | 4 |
| 2017/01/04 | Beans | 3 |
| 2017/01/04 | Pens | 5 |
| 2017/02/01 | Tubes | 4 |
| 2017/02/03 | Beans | 9 |
+------------+-------+----------+
我想要做的是添加一个列,将 A 列中的每个日期转换为一个正整数,该整数对应于自给定开始日期以来的天数。比如开始日期是2017/01/01,我要添加以下列
+------------+-------+----------+------+
| Date | Item | Quantity | Days |
+------------+-------+----------+------+
| 2017/01/01 | Beans | 2 | 1 |
| 2017/01/01 | Pens | 4 | 1 |
| 2017/01/04 | Beans | 3 | 4 |
| 2017/01/04 | Pens | 5 | 4 |
| 2017/01/08 | Tubes | 4 | 8 |
| 2017/01/09 | Beans | 9 | 9 |
+------------+-------+----------+------+
是否有一个简单的解决方案可以利用 R 的内部 date/time 处理(特别是 month/leapyears 等中的天数...)
这是评论者要求的 dput()
structure(list(date = structure(c(17167, 17167, 17170, 17170, 17174,
17175), class = "Date"), item = structure(c(1L, 2L, 1L, 2L, 3L, 1L),
.Label = c("Beans", "Pens", "Tubes"), class = "factor"), quantity =
c(2, 4, 3, 5, 4, 9)), class = "data.frame", row.names = c(NA, -6L))
预先感谢您的帮助,希望我的问题可以理解。
# Example data (please make it reproducible like this in future questions):
yourdata <-
data.frame(Quantity = c(2,4,3,5,4,9),
Item = c('Beans', 'Pens', 'Beans', 'Pens', 'Tubes', 'Beans'),
Date = c("2017/01/01", "2017/01/01","2017/01/04", "2017/01/04", '2017/01/01', "2017/01/09")
)
yourdata$difftime <- sapply(yourdata$Date, difftime, yourdata$Date[1]) + 1
Quantity Item Date difftime
1 2 Beans 2017/01/01 1
2 4 Pens 2017/01/01 1
3 3 Beans 2017/01/04 4
4 5 Pens 2017/01/04 4
5 4 Tubes 2017/01/08 8
6 9 Beans 2017/01/09 9
这也适用于您添加的 dput()
数据:
yourdata <- structure(list(date = structure(c(17167, 17167, 17170, 17170, 17174,
17175), class = "Date"), item = structure(c(1L, 2L, 1L, 2L, 3L, 1L),
.Label = c("Beans", "Pens", "Tubes"), class = "factor"), quantity =
c(2, 4, 3, 5, 4, 9)), class = "data.frame", row.names = c(NA, -6L))
yourdata$difftime <- sapply(yourdata$date, difftime, yourdata$date[1]) + 1
yourdata
date item quantity difftime
1 2017-01-01 Beans 2 1
2 2017-01-01 Pens 4 1
3 2017-01-04 Beans 3 4
4 2017-01-04 Pens 5 4
5 2017-01-08 Tubes 4 8
6 2017-01-09 Beans 9 9
transform(dat,dif=as.numeric(difftime(date,date[1],units = "days")+1))
date item quantity dif
1 2017-01-01 Beans 2 1
2 2017-01-01 Pens 4 1
3 2017-01-04 Beans 3 4
4 2017-01-04 Pens 5 4
5 2017-01-08 Tubes 4 8
6 2017-01-09 Beans 9 9
只需减去最小值并加 1。无论行顺序如何,这都有效。它假设您的数据是 Date
class(如您的 dput
).如果您的数据是 POSIXct
class,我建议首先将其强制转换为 Date
class,否则差异将以秒为单位。调用您的数据 dd
:
dd$days = as.integer(dd$date - min(dd$date)) + 1
dd
# date item quantity days
# 1 2017-01-01 Beans 2 1
# 2 2017-01-01 Pens 4 1
# 3 2017-01-04 Beans 3 4
# 4 2017-01-04 Pens 5 4
# 5 2017-01-08 Tubes 4 8
# 6 2017-01-09 Beans 9 9
希望有人能指出我的具体问题的解决方案。
假设我有一个数据框,在 A 列中我有格式为 (YYYY-MM-DD, POSIXct) 的日期,它们介于一些起点和终点之间(即 2017/01/01 到 2018/01/01 ).在 B 列中,我有一个项目列表,在 C 列中,我有一个项目在 A 中给出的日期的数量。此外,我想添加一个假设,尽管 A 列 运行 中的日期在已知开始之间和结束日期,并按顺序排列,它们不一定由相等的时间间隔分隔。示例可能如下所示:
+------------+-------+----------+
| Date | Item | Quantity |
+------------+-------+----------+
| 2017/01/01 | Beans | 2 |
| 2017/01/01 | Pens | 4 |
| 2017/01/04 | Beans | 3 |
| 2017/01/04 | Pens | 5 |
| 2017/02/01 | Tubes | 4 |
| 2017/02/03 | Beans | 9 |
+------------+-------+----------+
我想要做的是添加一个列,将 A 列中的每个日期转换为一个正整数,该整数对应于自给定开始日期以来的天数。比如开始日期是2017/01/01,我要添加以下列
+------------+-------+----------+------+
| Date | Item | Quantity | Days |
+------------+-------+----------+------+
| 2017/01/01 | Beans | 2 | 1 |
| 2017/01/01 | Pens | 4 | 1 |
| 2017/01/04 | Beans | 3 | 4 |
| 2017/01/04 | Pens | 5 | 4 |
| 2017/01/08 | Tubes | 4 | 8 |
| 2017/01/09 | Beans | 9 | 9 |
+------------+-------+----------+------+
是否有一个简单的解决方案可以利用 R 的内部 date/time 处理(特别是 month/leapyears 等中的天数...)
这是评论者要求的 dput()
structure(list(date = structure(c(17167, 17167, 17170, 17170, 17174,
17175), class = "Date"), item = structure(c(1L, 2L, 1L, 2L, 3L, 1L),
.Label = c("Beans", "Pens", "Tubes"), class = "factor"), quantity =
c(2, 4, 3, 5, 4, 9)), class = "data.frame", row.names = c(NA, -6L))
预先感谢您的帮助,希望我的问题可以理解。
# Example data (please make it reproducible like this in future questions):
yourdata <-
data.frame(Quantity = c(2,4,3,5,4,9),
Item = c('Beans', 'Pens', 'Beans', 'Pens', 'Tubes', 'Beans'),
Date = c("2017/01/01", "2017/01/01","2017/01/04", "2017/01/04", '2017/01/01', "2017/01/09")
)
yourdata$difftime <- sapply(yourdata$Date, difftime, yourdata$Date[1]) + 1
Quantity Item Date difftime 1 2 Beans 2017/01/01 1 2 4 Pens 2017/01/01 1 3 3 Beans 2017/01/04 4 4 5 Pens 2017/01/04 4 5 4 Tubes 2017/01/08 8 6 9 Beans 2017/01/09 9
这也适用于您添加的 dput()
数据:
yourdata <- structure(list(date = structure(c(17167, 17167, 17170, 17170, 17174,
17175), class = "Date"), item = structure(c(1L, 2L, 1L, 2L, 3L, 1L),
.Label = c("Beans", "Pens", "Tubes"), class = "factor"), quantity =
c(2, 4, 3, 5, 4, 9)), class = "data.frame", row.names = c(NA, -6L))
yourdata$difftime <- sapply(yourdata$date, difftime, yourdata$date[1]) + 1
yourdata
date item quantity difftime 1 2017-01-01 Beans 2 1 2 2017-01-01 Pens 4 1 3 2017-01-04 Beans 3 4 4 2017-01-04 Pens 5 4 5 2017-01-08 Tubes 4 8 6 2017-01-09 Beans 9 9
transform(dat,dif=as.numeric(difftime(date,date[1],units = "days")+1))
date item quantity dif
1 2017-01-01 Beans 2 1
2 2017-01-01 Pens 4 1
3 2017-01-04 Beans 3 4
4 2017-01-04 Pens 5 4
5 2017-01-08 Tubes 4 8
6 2017-01-09 Beans 9 9
只需减去最小值并加 1。无论行顺序如何,这都有效。它假设您的数据是 Date
class(如您的 dput
).如果您的数据是 POSIXct
class,我建议首先将其强制转换为 Date
class,否则差异将以秒为单位。调用您的数据 dd
:
dd$days = as.integer(dd$date - min(dd$date)) + 1
dd
# date item quantity days
# 1 2017-01-01 Beans 2 1
# 2 2017-01-01 Pens 4 1
# 3 2017-01-04 Beans 3 4
# 4 2017-01-04 Pens 5 4
# 5 2017-01-08 Tubes 4 8
# 6 2017-01-09 Beans 9 9