5

我有一个数据框

       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 分钟。我用循环做的。这可以以更优雅的方式实现吗?

4

3 回答 3

2

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
于 2019-02-06T14:23:33.640 回答
2

递归解决方案:

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
于 2019-02-06T15:11:03.673 回答
2

您可以为该任务编写一个小函数

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)

于 2019-02-06T14:05:47.847 回答