小编nat*_*ate的帖子

带有相同名称的列的连接表上的Rails".pluck"返回一个值,然后返回nil

Experiment has_many :features 
Feature belongs_to :experiment

Experiment.where("experiments.id=1")
    .joins(:features)
    .pluck("features.id", "experiments.id")
Run Code Online (Sandbox Code Playgroud)

我希望这能返回每个功能的ID和实验的ID.

[
    [1, 1],
    [2, 1],
    [3, 1],
    # ....
]
Run Code Online (Sandbox Code Playgroud)

相反,这将返回实验的id,然后返回nil

[
    [1, nil],
    [1, nil],
    [1, nil],
    # ....
]
Run Code Online (Sandbox Code Playgroud)

这有三个方面很奇怪:

  • 即使它是一个内连接,只返回一个实验我能够从功能中提取列(features.name)
  • 一切都很好,直到重复列名称.
  • 首先报告最后一个弹出列,就好像第一列被覆盖一样.切换拔除顺序会切换返回值.

这似乎是一个错误,但也许我做错了什么.有小费吗?

SQL输出:

SELECT features.id, experiments.id FROM "experiments" INNER JOIN "features" ON "features"."experiment_id" = "experiments"."id" WHERE (experiments.id=1)
Run Code Online (Sandbox Code Playgroud)

注意.这是一个与查询类似的简化问题:

Experiment.where("experiments.id=1")
    .joins(feature: { child2: { :child3 } })
    .pluck("feature.id, child3.id")
Run Code Online (Sandbox Code Playgroud)

ruby sql ruby-on-rails

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

data.table是否基于二进制搜索实现快速范围子集?那是什么语法?

我有一个花车向量.我想在各种范围内反复找到该向量的子集.我当前的语法(DT[x > 1.8 & x < 2.9])似乎是矢量扫描(它相对较慢).

是否有更快的语法利用二进制搜索基于范围/区间的data.tables子设置?

例:

set.seed(123L)
x = runif(1E6)
DT = data.table(x, key = "x")

# For foverlaps()
DT[,xtemp:=x]
range = data.table(start = 0.04, end = 0.5, key=c("start", "end"))


microbenchmark::microbenchmark(
    DT[x < 0.5 & x > 0.04], 
    x[x < 0.5 & x > 0.04],
    foverlaps(DT, range, by.x = c("x", "xtemp"))
    )

Unit: milliseconds
                                         expr       min        lq      mean    median        uq      max neval
                       DT[x < 0.5 & x > 0.04]  12.65391  16.10852  18.43412  17.23268  17.76868 104.1112 …
Run Code Online (Sandbox Code Playgroud)

r data.table

5
推荐指数
2
解决办法
276
查看次数

从data.table中检索动态列集

分配名称存储在字符向量中的列集很好地讨论,但我似乎无法找到检索列并对其进行操作的解决方案.

cols = c("x", "y")
DT = data.table(x = 10:15, y = 20:25)

> DT
    x  y
1: 10 20
2: 11 21
3: 12 22
4: 13 23
5: 14 24
6: 15 25
Run Code Online (Sandbox Code Playgroud)

期望的输出

> DT[,paste(x,y)]

[1] "10 20" "11 21" "12 22" "13 23" "14 24" "15 25"
Run Code Online (Sandbox Code Playgroud)

我的目标是根据列中的每列获取唯一标识符cols.我可以通过硬编码列名来做到这一点,但我宁愿参考cols


这是我尝试过的一些语法及其输出.

得到()

> DT[,get(cols)]

[1] 10 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)

括弧

> DT[,(cols)]

[1] "x" "y"
Run Code Online (Sandbox Code Playgroud)

名单

> DT[,as.list(cols)]
   V1 V2
1:  x  y …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

标签 统计

data.table ×2

r ×2

ruby ×1

ruby-on-rails ×1

sql ×1