Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算没有for循环的后续天数之间的差异_R - Fatal编程技术网

计算没有for循环的后续天数之间的差异

计算没有for循环的后续天数之间的差异,r,R,我有以下数据框: time <- c("2004-01-01 01:30:00","2004-01-01 04:30:00","2004-01-01 07:30:00", "2004-01-01 10:30:00","2004-01-01 13:30:00","2004-01-01 16:30:00", "2004-01-01 19:30:00","2004-01-01 22:30:00","2004-01-02 01:30:00",

我有以下数据框:

time <- c("2004-01-01 01:30:00","2004-01-01 04:30:00","2004-01-01 07:30:00",
          "2004-01-01 10:30:00","2004-01-01 13:30:00","2004-01-01 16:30:00",
          "2004-01-01 19:30:00","2004-01-01 22:30:00","2004-01-02 01:30:00",
          "2004-01-02 04:30:00","2004-01-02 07:30:00","2004-01-02 10:30:00",
          "2004-01-02 13:30:00","2004-01-02 16:30:00","2004-01-02 19:30:00",
          "2004-01-02 22:30:00","2004-01-03 01:30:00","2004-01-03 04:30:00",
          "2004-01-03 07:30:00","2004-01-03 10:30:00")
d <- c(0.00, 0.00,152808.30, 739872.84, 82641.22, 83031.04, 83031.04, 82641.22, 0.00, 
       0.00, 267024.71,1247414.7, 151638.85, 151249.03, 151249.03, 152028.67, 0.00, 0.00, 
       296650.81,1355783.85)
dat <- data.frame(time = time, dat = d)
正如您所看到的,在最初的几个小时里,存在着不匹配

有人能推荐另一种方法吗?

使用可以使用
lag()
from
dplyr
groupby()

Use可以使用
lag()
from
dplyr
groupby()


对于列表
l
,您可以通过

dat <- data.frame(
time = c("2004-01-01 01:30:00","2004-01-01 04:30:00","2004-01-01 07:30:00",
          "2004-01-01 10:30:00","2004-01-01 13:30:00","2004-01-01 16:30:00",
          "2004-01-01 19:30:00","2004-01-01 22:30:00","2004-01-02 01:30:00",
          "2004-01-02 04:30:00","2004-01-02 07:30:00","2004-01-02 10:30:00",
          "2004-01-02 13:30:00","2004-01-02 16:30:00","2004-01-02 19:30:00",
          "2004-01-02 22:30:00","2004-01-03 01:30:00","2004-01-03 04:30:00",
          "2004-01-03 07:30:00","2004-01-03 10:30:00"),
dat = c(0.00, 0.00,152808.30, 739872.84, 82641.22, 83031.04, 83031.04, 82641.22, 0.00, 
       0.00, 267024.71,1247414.7, 151638.85, 151249.03, 151249.03, 152028.67, 0.00, 0.00, 
       296650.81,1355783.85)
)

dat$itime <- as.numeric(as.Date(dat$time))
utime <- unique(dat$itime)

daydat <- function(u) { 
  dat2 <- dat[dat$itime==u,]
  data.frame(dateTime = dat2$time, dd = c(dat2$dat[1], abs(diff(dat2$dat)))/10800)
}
l <- lapply(utime, daydat)
或者不创建
dat$itime

daydat <- function(d) data.frame(dateTime = d$time, dd = c(d$dat[1], abs(diff(d$dat)))/10800)
l <- lapply(split(dat, as.Date(dat$time)), FUN=daydat)
如果要将结果保存在原始数据帧中,可以使用
ave()


dat$dd对于您的列表
l
您可以通过

dat <- data.frame(
time = c("2004-01-01 01:30:00","2004-01-01 04:30:00","2004-01-01 07:30:00",
          "2004-01-01 10:30:00","2004-01-01 13:30:00","2004-01-01 16:30:00",
          "2004-01-01 19:30:00","2004-01-01 22:30:00","2004-01-02 01:30:00",
          "2004-01-02 04:30:00","2004-01-02 07:30:00","2004-01-02 10:30:00",
          "2004-01-02 13:30:00","2004-01-02 16:30:00","2004-01-02 19:30:00",
          "2004-01-02 22:30:00","2004-01-03 01:30:00","2004-01-03 04:30:00",
          "2004-01-03 07:30:00","2004-01-03 10:30:00"),
dat = c(0.00, 0.00,152808.30, 739872.84, 82641.22, 83031.04, 83031.04, 82641.22, 0.00, 
       0.00, 267024.71,1247414.7, 151638.85, 151249.03, 151249.03, 152028.67, 0.00, 0.00, 
       296650.81,1355783.85)
)

dat$itime <- as.numeric(as.Date(dat$time))
utime <- unique(dat$itime)

daydat <- function(u) { 
  dat2 <- dat[dat$itime==u,]
  data.frame(dateTime = dat2$time, dd = c(dat2$dat[1], abs(diff(dat2$dat)))/10800)
}
l <- lapply(utime, daydat)
或者不创建
dat$itime

daydat <- function(d) data.frame(dateTime = d$time, dd = c(d$dat[1], abs(diff(d$dat)))/10800)
l <- lapply(split(dat, as.Date(dat$time)), FUN=daydat)
如果要将结果保存在原始数据帧中,可以使用
ave()


dat$dd
df%>%mutate(time=as.Date(time))%%>%groupby(time)%%>%mutate(dd=(dat lag(dat))/10800)
simpler@GGamba对我同意。但保留了额外的步骤和列以查看操作中的步骤。
df%>%mutate(time=as.Date(time))%%>%groupby(time)%%>%mutate(dd=(dat lag(dat))/10800)
成功simpler@GGamba对我同意。但是保留了额外的步骤和cols以查看实际操作中的步骤。第一种方法有效,尽管您需要在函数中的diff之前添加abs。第一种方法有效,尽管您需要在函数中的diff之前添加abs。
dat %>%
    mutate(time = as.Date(time)) %>%
    group_by(time) %>%
    mutate(diff = (dat-lag(dat)) / 10800)
dat <- data.frame(
time = c("2004-01-01 01:30:00","2004-01-01 04:30:00","2004-01-01 07:30:00",
          "2004-01-01 10:30:00","2004-01-01 13:30:00","2004-01-01 16:30:00",
          "2004-01-01 19:30:00","2004-01-01 22:30:00","2004-01-02 01:30:00",
          "2004-01-02 04:30:00","2004-01-02 07:30:00","2004-01-02 10:30:00",
          "2004-01-02 13:30:00","2004-01-02 16:30:00","2004-01-02 19:30:00",
          "2004-01-02 22:30:00","2004-01-03 01:30:00","2004-01-03 04:30:00",
          "2004-01-03 07:30:00","2004-01-03 10:30:00"),
dat = c(0.00, 0.00,152808.30, 739872.84, 82641.22, 83031.04, 83031.04, 82641.22, 0.00, 
       0.00, 267024.71,1247414.7, 151638.85, 151249.03, 151249.03, 152028.67, 0.00, 0.00, 
       296650.81,1355783.85)
)

dat$itime <- as.numeric(as.Date(dat$time))
utime <- unique(dat$itime)

daydat <- function(u) { 
  dat2 <- dat[dat$itime==u,]
  data.frame(dateTime = dat2$time, dd = c(dat2$dat[1], abs(diff(dat2$dat)))/10800)
}
l <- lapply(utime, daydat)
dat$itime <- as.numeric(as.Date(dat$time))

daydat <- function(d) data.frame(dateTime = d$time, dd = c(d$dat[1], abs(diff(d$dat)))/10800)

L <- split(dat, dat$itime)
l <- lapply(L, daydat)
daydat <- function(d) data.frame(dateTime = d$time, dd = c(d$dat[1], abs(diff(d$dat)))/10800)
l <- lapply(split(dat, as.Date(dat$time)), FUN=daydat)
l2 <- unclass(by(dat, as.Date(dat$time), FUN=daydat))
dat$dd <- ave(dat$dat, as.Date(dat$time), FUN=function(x) c(x[1], abs(diff(x)))/10800)