【问题标题】:R: by grouping in datatable, get the first row and their corresponding row numbers for each groupR:通过在数据表中进行分组,获取每组的第一行及其对应的行号
【发布时间】:2017-12-22 13:21:20
【问题描述】:

我想知道使用datatable,如何使用"special-symbols" 的组合来获得第一行它们对应的行号(在参考资料中)在每个group的数据集中?

例如:

Library(data.table)  
copy(mtcars) -> mt
setDT(mt) -> mt

获取cyl的每一组的第一行:

 mt[, .SD[1], by = cyl]

    cyl  mpg disp  hp drat   wt  qsec vs am gear carb
1:   6 21.0  160 110 3.90 2.62 16.46  0  1    4    4
2:   4 22.8  108  93 3.85 2.32 18.61  1  1    4    1
3:   8 18.7  360 175 3.15 3.44 17.02  0  0    3    2

根据cyl获取每个组对应的mt中的行号:

mt[, .I[1], by = cyl]
   cyl V1
1:   6  1
2:   4  3
3:   8  5

预期输出:

    cyl  mpg disp  hp drat   wt  qsec vs am gear carb   row_N
1:   6 21.0  160 110 3.90 2.62 16.46  0  1    4    4    1
2:   4 22.8  108  93 3.85 2.32 18.61  1  1    4    1    3
3:   8 18.7  360 175 3.15 3.44 17.02  0  0    3    2    5

我尝试了以下方法但没有成功:

mt[, .SD[1], by= cyl][mt[, .I[1], by=cyl]]
mt[, .SD[1], by= cyl][mt[, `:=` (row_N = .I[1], by=cyl)]]

非常感谢任何有关解释的帮助。

【问题讨论】:

    标签: r datatable group-by grouping symbols


    【解决方案1】:

    一种方法是将列与cbind 组合在一起。

    mt[, cbind(.SD[1], row_N=.I[1]), by = cyl]
       cyl  mpg disp  hp drat   wt  qsec vs am gear carb row_N
    1:   6 21.0  160 110 3.90 2.62 16.46  0  1    4    4     1
    2:   4 22.8  108  93 3.85 2.32 18.61  1  1    4    1     3
    3:   8 18.7  360 175 3.15 3.44 17.02  0  0    3    2     5
    

    【讨论】:

    • 或者只是c而不是cbind,因为c(list(1),2)返回一个将被转换为列的列表。
    猜你喜欢
    • 2013-10-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多