在R中每t个时间单位保存数据

6g8kf2rb  于 2024-01-03  发布在  其他
关注(0)|答案(2)|浏览(124)

我想在一个循环中移动,并在特定的时间间隔保存一个值。我想用这种形式:

t <- 0
    t_end <- 10
    time_step <- 0.01
    record_interval <- 1
    while (t <= t_end){
        if (t %% record_interval == 0) print(t)
        t <- t + time_step
    }

字符串
但当然,这样做是失败的,由于机器精度的问题。
我能做的:

if (isTRUE(all.equal(t %% record_interval,0, tolerance = time_step*0.1))) { ...


但即使这样也失败了,因为有时它给出的模是record_interval而不是0。
所以,我可以用一个or语句运行我的代码,使用上面的语句,并检查模是否等于record_interval,但这是令人难以置信的丑陋。我相信有一个明显的,简单的方法来解决这个问题,但我不知所措。我不想引入不必要的整数计数器(all.equal部分可以工作,只是不太好看,所以看起来不那么糟糕),我希望能够根据需要更改time_step和record_interval。

1szpjjfi

1szpjjfi1#

一个选项是使用tidyverse创建一个名为您的百分之一值的新列,将数据过滤到您想要的间隔,然后删除新列。

# Load tidyverse
library(tidyverse)

# Create example data
dat <- data.frame(
  t = seq(0,10,0.01)
)

head(dat)
#>      t
#> 1 0.00
#> 2 0.01
#> 3 0.02
#> 4 0.03
#> 5 0.04
#> 6 0.05

# Create new column, filter the time interval you want, then remove the new column
dat2 <- dat %>%
  mutate(hundredths = floor(t * 100) %% 10) %>%
  filter(hundredths == 7) %>%
  select(-hundredths)

head(dat2)
#>      t
#> 1 0.07
#> 2 0.17
#> 3 0.27
#> 4 0.37
#> 5 0.47
#> 6 0.57

字符串
创建于2023-12-01使用reprex v2.0.2

5uzkadbs

5uzkadbs2#

您可以通过添加一个滚动变量并在达到保存值的点时重置它来解决精度问题:

t_rolling <- t_rolling + time_step; if (t_rolling > record_interval) { print(t); t_rolling <- 0 }

字符串
感谢您的帮助的答复!

相关问题