【问题标题】:R - how to access a data table data by key value on rows and columnsR - 如何通过行和列上的键值访问数据表数据
【发布时间】:2014-05-05 13:46:24
【问题描述】:

我有一个数据表:

> COUNT_ID_CATEGORY
                id 706 799 1703 1726 2119 2202 3203 3504 3509 4401 4517 5122 5558 5616 5619 5824 6202 7205 9115 9909
     1:      86246   9   0   15    4   28    0   15   63   39    5    7   25   27   43   12   64    1   16    0   96
     2:      86252   3   0   17    6   21    0    6   62   24    6    7   12   25   32    6   49    1   26    0  103
     3:   12262064   3   0    1    1   12    0    0    2    1    0    0    0    2    4    0    4    0    0    0   12
     4:   12277270   2   0    0    0    1    0    3    0    3    0    0    0    0   24    0    6    2    5    0   60
     5:   12332190   2   0    2    0    4    0    1    2    0    0    0    1    0    3    0    1    3    2    0   46
    ---                                                                                                             
310661: 4837642552   0   0    0    0    0    0    1    0    0    0    0    0    0    0    0    1    0    0    1    0
310662: 4843417324   0   0    0    0    0    0    0    0    0    0    0    0    0    0    1    2    0    0    0    0
310663: 4847628950   2   0    1    1   16    0    0    2    3    0    0    2    9    5    0    3    3    2    3   14
310664: 4847787712   0   0    0    0    1    0    0    0    1    0    0    0    0    0    0    0    0    0    0    0
310665: 4853598737   0   0    0    0    0    0    0    0    0    0    0    0    1    0    0    1    0    0    0    0
> class(COUNT_ID_CATEGORY)
[1] "data.table" "data.frame"
>

我希望尽快读取数据,如下所示:

COUNT_ID_CATEGORY for (id == 86246) & (category == 706)

它应该返回值 9(表中的左上角)。 (例如)

我可以通过以下方式获取该行:

COUNT_ID_CATEGORY[id==86246,]

但我如何获得该列?

> dput(head(COUNT_ID_CATEGORY))
structure(list(id = c(86246, 86252, 12262064, 12277270, 12332190, 
12524696), `706` = c(9L, 3L, 3L, 2L, 2L, 0L), `799` = c(0L, 0L, 
0L, 0L, 0L, 0L), `1703` = c(15L, 17L, 1L, 0L, 2L, 0L), `1726` = c(4L, 
6L, 1L, 0L, 0L, 0L), `2119` = c(28L, 21L, 12L, 1L, 4L, 0L), `2202` = c(0L, 
0L, 0L, 0L, 0L, 0L), `3203` = c(15L, 6L, 0L, 3L, 1L, 0L), `3504` = c(63L, 
62L, 2L, 0L, 2L, 11L), `3509` = c(39L, 24L, 1L, 3L, 0L, 3L), 
    `4401` = c(5L, 6L, 0L, 0L, 0L, 1L), `4517` = c(7L, 7L, 0L, 
    0L, 0L, 1L), `5122` = c(25L, 12L, 0L, 0L, 1L, 0L), `5558` = c(27L, 
    25L, 2L, 0L, 0L, 1L), `5616` = c(43L, 32L, 4L, 24L, 3L, 18L
    ), `5619` = c(12L, 6L, 0L, 0L, 0L, 0L), `5824` = c(64L, 49L, 
    4L, 6L, 1L, 10L), `6202` = c(1L, 1L, 0L, 2L, 3L, 6L), `7205` = c(16L, 
    26L, 0L, 5L, 2L, 4L), `9115` = c(0L, 0L, 0L, 0L, 0L, 0L), 
    `9909` = c(96L, 103L, 12L, 60L, 46L, 1L)), .Names = c("id", 
"706", "799", "1703", "1726", "2119", "2202", "3203", "3504", 
"3509", "4401", "4517", "5122", "5558", "5616", "5619", "5824", 
"6202", "7205", "9115", "9909"), sorted = "id", class = c("data.table", 
"data.frame"), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x043a24a0>)

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    首先setkey 使用data.table 的二进制搜索/子集功能进行快速查找:

    setkey(COUNT_ID_CATEGORY, id)
    

    那么你可以这样做:

    COUNT_ID_CATEGORY[J(86246)][, '706']
    

    第一部分COUNT_ID_CATEGORY[J(86246)] 使用二分搜索执行快速子集。您可以阅读更多关于J(.) 及其作用here 的信息。

    下一部分[, '706', with=FALSE] 采用子集结果,即data.table,并仅选择列706

    为了完整起见,this post 展示了更多从 data.table 中选择/子集列的方法。

    【讨论】:

    • @Arun 感谢您的编辑,很好的解释。在我的机器上,dt[J(i)]dt[i] 之间没有速度差异,但在大样本上,我的笔记本电脑运行 dt[i,j,with=F]dt[i][,j,with=F] 快大约 1.5 倍,尽管出于学习目的,我可以看到为什么后者更清晰。
    • GaryWeissman、DT[J(86246)]DT[86246] 是非常不同的东西。第一个子集键列与 86246 匹配的行。第二个子集第 86246 行。
    • 对于第二个问题,data.table v by-without-by,这意味着DT[J(.), j, ..] 对每个匹配项执行j。这就是为什么我先加入然后做了一个列子集。在 1.9.3+ 中,默认行为将是正常连接 - 所以它会很快。如果需要 by-without-by,那么我们必须明确地将其声明为 by=.EACHI。查看 1.9.3 的新闻以获取更多信息(以及数据表邮件列表以供讨论)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2021-01-08
    • 2011-10-12
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多