如何按顺序添加行值一定次数并填充 R 中的每一行?
How to go about adding row values in sequence a certain number of times and filling in every row in R?
我一直在尝试使用 R 来清理一些数据。我的数据集如下所示:
DateTime Day ...
2018-10-01 10:00:00 0
2018-10-01 10:00:05 0
2018-10-01 10:00:10 0
2018-10-01 10:00:15 0
2018-10-01 10:00:20 0
2018-10-01 10:00:25 0
2018-10-01 10:00:30 0
2018-10-01 10:00:35 0
它在 5 秒 bin 中,所以 24 小时 = 17280 bin。我正在尝试添加一个 Day
列,该列基本上只给出一个从开头开始的值 1
并计算 24 小时并为第 1 天提供 '1,1,1,1,1...1'
和 '2,2,2,2,2...2'
从第 2 天的 10:00:00
开始,一直到每个数据集。
所以我想要的输出看起来像这样:
DateTime Day
2018-10-01 10:00:00 1
2018-10-01 10:00:05 1
2018-10-01 10:00:10 1
2018-10-01 10:00:15 1
... ... ...
2018-10-02 9:59:50 1
2018-10-02 9:59:55 1
2018-10-02 10:00:00 2
2018-10-02 10:00:05 2
... ... ...
2018-10-03 9:59:50 2
2018-10-03 9:59:55 2
2018-10-03 10:00:00 3
2018-10-03 10:00:05 3
为此,我想出了一个代码,使用 rep()
:
创建一个数字向量
days<- round(nrow(df)/17280)
sdays <- rep(1:days, each = 17280, times = 1)
df$Day <- sdays
如果日期与 24 小时的长度完全匹配并且我不需要向下或向上舍入,则此方法有效。但是,并非我正在查看的每个数据集都具有完美的 24 小时日期范围,而且我不希望编辑掉数据,因为每个 bin 对于我正在查看的内容都是必需的。因此,我一直在尝试为此寻找一种更合适的方法,但收效甚微(尽管我确信它在 www 中的某个地方,因为它非常基本)。
您可以 cut()
date
通过 24 hours
:
数据
dat <- data.frame(
Date = seq(ISOdatetime(2018, 10, 01, 10, 0, 0, "GMT"),
ISOdatetime(2018, 10, 03, 10, 0, 5, "GMT"),
by = 5
))
将日期缩短 24 小时
dat$Day <- cut(dat$Date, "24 hours", F)
输出
head(dat, 4)
dat[(nrow(dat) %/% 2 - 2):(nrow(dat) %/% 2 + 1), ]
tail(dat, 4)
Date Day
1 2018-10-01 10:00:00 1
2 2018-10-01 10:00:05 1
3 2018-10-01 10:00:10 1
4 2018-10-01 10:00:15 1
.......................
17279 2018-10-02 09:59:50 1
17280 2018-10-02 09:59:55 1
17281 2018-10-02 10:00:00 2
17282 2018-10-02 10:00:05 2
.......................
34559 2018-10-03 09:59:50 2
34560 2018-10-03 09:59:55 2
34561 2018-10-03 10:00:00 3
34562 2018-10-03 10:00:05 3
只需使用简单的 difftime 计算,并四舍五入到最接近的整数..
数据
dat <- data.frame(
Date = seq(as.POSIXct("2018-10-01 10:00:00", format = "%Y-%m-%d %H:%M:%S"),
as.POSIXct("2018-10-03 10:00:05", format = "%Y-%m-%d %H:%M:%S"),
by = 5
))
代码
dat$day <- as.numeric( ceiling( difftime( dat$Date, dat$Date[1] - 5, units = "days") ) )
输出
# Date day
# 1 2018-10-01 10:00:00 1
# 2 2018-10-01 10:00:05 1
# 3 2018-10-01 10:00:10 1
# 4 2018-10-01 10:00:15 1
# 5 2018-10-01 10:00:20 1
# 6 2018-10-01 10:00:25 1
# ....
# 17278 2018-10-02 09:59:45 1
# 17279 2018-10-02 09:59:50 1
# 17280 2018-10-02 09:59:55 1
# 17281 2018-10-02 10:00:00 2
# 17282 2018-10-02 10:00:05 2
我一直在尝试使用 R 来清理一些数据。我的数据集如下所示:
DateTime Day ...
2018-10-01 10:00:00 0
2018-10-01 10:00:05 0
2018-10-01 10:00:10 0
2018-10-01 10:00:15 0
2018-10-01 10:00:20 0
2018-10-01 10:00:25 0
2018-10-01 10:00:30 0
2018-10-01 10:00:35 0
它在 5 秒 bin 中,所以 24 小时 = 17280 bin。我正在尝试添加一个 Day
列,该列基本上只给出一个从开头开始的值 1
并计算 24 小时并为第 1 天提供 '1,1,1,1,1...1'
和 '2,2,2,2,2...2'
从第 2 天的 10:00:00
开始,一直到每个数据集。
所以我想要的输出看起来像这样:
DateTime Day
2018-10-01 10:00:00 1
2018-10-01 10:00:05 1
2018-10-01 10:00:10 1
2018-10-01 10:00:15 1
... ... ...
2018-10-02 9:59:50 1
2018-10-02 9:59:55 1
2018-10-02 10:00:00 2
2018-10-02 10:00:05 2
... ... ...
2018-10-03 9:59:50 2
2018-10-03 9:59:55 2
2018-10-03 10:00:00 3
2018-10-03 10:00:05 3
为此,我想出了一个代码,使用 rep()
:
days<- round(nrow(df)/17280)
sdays <- rep(1:days, each = 17280, times = 1)
df$Day <- sdays
如果日期与 24 小时的长度完全匹配并且我不需要向下或向上舍入,则此方法有效。但是,并非我正在查看的每个数据集都具有完美的 24 小时日期范围,而且我不希望编辑掉数据,因为每个 bin 对于我正在查看的内容都是必需的。因此,我一直在尝试为此寻找一种更合适的方法,但收效甚微(尽管我确信它在 www 中的某个地方,因为它非常基本)。
您可以 cut()
date
通过 24 hours
:
数据
dat <- data.frame(
Date = seq(ISOdatetime(2018, 10, 01, 10, 0, 0, "GMT"),
ISOdatetime(2018, 10, 03, 10, 0, 5, "GMT"),
by = 5
))
将日期缩短 24 小时
dat$Day <- cut(dat$Date, "24 hours", F)
输出
head(dat, 4)
dat[(nrow(dat) %/% 2 - 2):(nrow(dat) %/% 2 + 1), ]
tail(dat, 4)
Date Day
1 2018-10-01 10:00:00 1
2 2018-10-01 10:00:05 1
3 2018-10-01 10:00:10 1
4 2018-10-01 10:00:15 1
.......................
17279 2018-10-02 09:59:50 1
17280 2018-10-02 09:59:55 1
17281 2018-10-02 10:00:00 2
17282 2018-10-02 10:00:05 2
.......................
34559 2018-10-03 09:59:50 2
34560 2018-10-03 09:59:55 2
34561 2018-10-03 10:00:00 3
34562 2018-10-03 10:00:05 3
只需使用简单的 difftime 计算,并四舍五入到最接近的整数..
数据
dat <- data.frame(
Date = seq(as.POSIXct("2018-10-01 10:00:00", format = "%Y-%m-%d %H:%M:%S"),
as.POSIXct("2018-10-03 10:00:05", format = "%Y-%m-%d %H:%M:%S"),
by = 5
))
代码
dat$day <- as.numeric( ceiling( difftime( dat$Date, dat$Date[1] - 5, units = "days") ) )
输出
# Date day
# 1 2018-10-01 10:00:00 1
# 2 2018-10-01 10:00:05 1
# 3 2018-10-01 10:00:10 1
# 4 2018-10-01 10:00:15 1
# 5 2018-10-01 10:00:20 1
# 6 2018-10-01 10:00:25 1
# ....
# 17278 2018-10-02 09:59:45 1
# 17279 2018-10-02 09:59:50 1
# 17280 2018-10-02 09:59:55 1
# 17281 2018-10-02 10:00:00 2
# 17282 2018-10-02 10:00:05 2