将一个整数分布在几行中,其次数等于它除以一个常量
Spread an integer over several rows as many times as it is divided by a constant
我有一个数据框
Date repair
<date> <dbl>
2018-07-01 4420
2018-07-02 NA
2018-07-03 NA
2018-07-04 NA
2018-07-05 NA
其中 4420 是以分钟为单位的时间。我想得到这个:
Date repair
<date> <dbl>
2018-07-01 1440
2018-07-02 1440
2018-07-03 1440
2018-07-04 100
2018-07-05 NA
其中 1440 分钟 - 一天还有 100 分钟。我是用循环做的。可以用更优雅的方式实现吗?
你可以为那个任务写一个小函数
f <- function(x, y, length_out) {
remainder <- x %% y
if(remainder == 0) {
`length<-`(rep(y, x %/% y), length_out)
} else {
`length<-`(c(rep(y, x %/% y), remainder), length_out)
}
}
输入
x <- 4420
y <- 24 * 60
结果
f(x, y, length_out = 10)
# [1] 1440 1440 1440 100 NA NA NA NA NA NA
length_out
应该大概等于 nrow(your_data)
与dplyr
:
library(dplyr)
df %>%
mutate(
repair = c(rep(1440, floor(repair[1] / 1440)),
repair[1] %% 1440,
rep(NA, n() - length(c(rep(1440, floor(repair[1] / 1440)), repair[1] %% 1440))))
)
输出:
Date repair
1 2018-07-01 1440
2 2018-07-02 1440
3 2018-07-03 1440
4 2018-07-04 100
5 2018-07-05 NA
一个递归解决方案:
fun <- function(x, y, i = 0){
if(x <= y) c(rep(y, i), x) else fun(x-y, y, i+1)
}
fun(4420, 1440)[1:nrow(df)]
# [1] 1440 1440 1440 100 NA
我有一个数据框
Date repair
<date> <dbl>
2018-07-01 4420
2018-07-02 NA
2018-07-03 NA
2018-07-04 NA
2018-07-05 NA
其中 4420 是以分钟为单位的时间。我想得到这个:
Date repair
<date> <dbl>
2018-07-01 1440
2018-07-02 1440
2018-07-03 1440
2018-07-04 100
2018-07-05 NA
其中 1440 分钟 - 一天还有 100 分钟。我是用循环做的。可以用更优雅的方式实现吗?
你可以为那个任务写一个小函数
f <- function(x, y, length_out) {
remainder <- x %% y
if(remainder == 0) {
`length<-`(rep(y, x %/% y), length_out)
} else {
`length<-`(c(rep(y, x %/% y), remainder), length_out)
}
}
输入
x <- 4420
y <- 24 * 60
结果
f(x, y, length_out = 10)
# [1] 1440 1440 1440 100 NA NA NA NA NA NA
length_out
应该大概等于 nrow(your_data)
与dplyr
:
library(dplyr)
df %>%
mutate(
repair = c(rep(1440, floor(repair[1] / 1440)),
repair[1] %% 1440,
rep(NA, n() - length(c(rep(1440, floor(repair[1] / 1440)), repair[1] %% 1440))))
)
输出:
Date repair
1 2018-07-01 1440
2 2018-07-02 1440
3 2018-07-03 1440
4 2018-07-04 100
5 2018-07-05 NA
一个递归解决方案:
fun <- function(x, y, i = 0){
if(x <= y) c(rep(y, i), x) else fun(x-y, y, i+1)
}
fun(4420, 1440)[1:nrow(df)]
# [1] 1440 1440 1440 100 NA