小编Hak*_*kki的帖子

R lubridate ymd_hms 毫秒差异

我在时间转换中遗漏了什么吗?非常简单的例子:

library(lubridate)
time <- "2019-01-14 10:58:23.438000"

op <- options(digits.secs=6)
ymd_hms(time, tz = "Europe/Helsinki")
[1] "2019-01-14 10:58:23.437 EET"

ymd_hms(time)
[1] "2019-01-14 10:58:23.437 UTC"
Run Code Online (Sandbox Code Playgroud)

为什么这里的毫秒数是一秒?似乎不是四舍五入的问题?

虽然这似乎有效:

time <- "2019-01-14 10:58:23.123456"

op <- options(digits.secs=6)

ymd_hms(time)
[1] "2019-01-14 10:58:23.123456 UTC"
Run Code Online (Sandbox Code Playgroud)

会话信息

sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=Finnish_Finland.1252  LC_CTYPE=Finnish_Finland.1252    LC_MONETARY=Finnish_Finland.1252 LC_NUMERIC=C                    
[5] LC_TIME=Finnish_Finland.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] lubridate_1.7.4 …
Run Code Online (Sandbox Code Playgroud)

r lubridate

6
推荐指数
1
解决办法
2305
查看次数

使用 group_by tidyverse 自定义函数

我在理解 group_by 如何在 tidyverse 中工作时遗漏了一些内容。示例将阐明:

我创建了以下函数,它需要很少的参数并计算 tibble 内的最佳权重(可能不是最漂亮的,但似乎有效):

library(lpSolveAPI)
library(tidyverse)

weights_fun <- function(data_tbl, objective, constraint){
  cols <- c("objective", "constraint")
  linear.dt <- data_tbl %>% select_(.dots = cols)
  lp.mod <- make.lp(0, NROW(linear.dt))
  set.objfn(lp.mod, linear.dt$amount)
  lp.control(lp.mod,sense="max")
  add.constraint(lp.mod, linear.dt$duration, "=", 6)
  add.constraint(lp.mod, rep(1, nrow(linear.dt)), "=", 1)
  set.bounds(lp.mod, upper = rep(0.4, nrow(linear.dt)))
  set.bounds(lp.mod, lower = rep(0.10, nrow(linear.dt)))
  solve(lp.mod)
  weights <- round(get.variables(lp.mod), 4)
  return(weights)
}
Run Code Online (Sandbox Code Playgroud)

当我在 tibble 中只有一组时,这个函数效果很好。我创建函数的方法是尝试通过在一个函数上进行测试来使其工作,并希望当我稍后对数据进行切片时它能够工作。

weights_fun(one_group, "amount", "duration")
one_group$weights <- weights_fun(one_group, "amount", "duration")


  # A tibble: 5 x 6
        date country bucket   amount …
Run Code Online (Sandbox Code Playgroud)

r tidyverse

5
推荐指数
1
解决办法
1033
查看次数

使用 dbplyr 进行数据库计算

我有一个非常简单的问题,会产生错误。示例将清除这一点。

library(odbc)
library(DBI)
library(dplyr)
library(dbplyr)

con <- dbConnect(odbc(), "myDSN")

tbl_test <- tibble(ID = c("A", "A", "A", "B", "B", "B"),
                   val = c(1, 2, 3, 4, 5, 6),
                   cond = c("H", "H", "A", "A", "A", "H"))

dbWriteTable(con, "tbl_test", tbl_test, overwrite = TRUE)
Run Code Online (Sandbox Code Playgroud)

将简单表写入数据库后,我在 db 中添加到表的链接,并尝试使用正常工作的简单条件总和。但是会遇到错误。

db_tbl <- tbl(con, in_schema("dbo", "tbl_test"))

db_tbl %>% 
  group_by(ID) %>% 
  summarise(sum = sum(val, na.rm = TRUE),
            count_cond = sum(cond == "H", na.rm=TRUE),
            sum_cond = sum(val == "H", na.rm=TRUE))

Error: <SQL> 'SELECT  TOP 10 "ID", SUM("val") AS "sum", …
Run Code Online (Sandbox Code Playgroud)

database r r-dbi dbplyr

4
推荐指数
1
解决办法
491
查看次数

在 data.table R 中按组滚动

我试图按组通过 data.table 滚动我的函数并遇到问题。不确定我应该更改我的功能还是我的调用错误。这是一个简单的例子:

数据

 test <- data.table(return=c(0.1, 0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.2, 0.2),
                   sec=c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"))
Run Code Online (Sandbox Code Playgroud)

我的职能

zoo_fun <- function(dt, N) {
  (rollapply(dt$return + 1, N, FUN=prod, fill=NA, align='right') - 1)
}
Run Code Online (Sandbox Code Playgroud)

运行它(我想创建新的列动量,这只是最新 ​​3 个观察值的乘积,每个观察值加一个(因此分组依据 = 秒)。

test[, momentum3 := zoo_fun(test, 3), by=sec]

    Warning messages:
    1: In `[.data.table`(test, , `:=`(momentum3, zoo_fun(test, 3)), by = sec) :
      RHS 1 is length 10 (greater than the size (5) of group 1). The …
Run Code Online (Sandbox Code Playgroud)

grouping r data.table

1
推荐指数
1
解决办法
2806
查看次数

标签 统计

r ×4

data.table ×1

database ×1

dbplyr ×1

grouping ×1

lubridate ×1

r-dbi ×1

tidyverse ×1