【问题标题】:Subset data.table altering subset limit between factor levels子集 data.table 更改因子级别之间的子集限制
【发布时间】:2012-06-27 12:10:55
【问题描述】:

我很难尝试在 R 中对 data.table(包)进行子集化。举一个以下示例

library(data.table)

x = c(rep("a", 6), rep("b", 5))
y = c(0,2,1,0,1,2, 0,1,0,2,1)
z = c(1:6,1:5) + rnorm(11, 0.02, 0.1)

DT = data.table(ind = x, cond = y, dist = z)

      ind cond     dist
 [1,]   a    0 1.078966
 [2,]   a    2 1.987159
 [3,]   a    1 3.143391
 [4,]   a    0 3.937058
 [5,]   a    1 5.037681
 [6,]   a    2 6.036432
 [7,]   b    0 1.057809
 [8,]   b    1 2.144755
 [9,]   b    0 3.010903
[10,]   b    2 3.937765
[11,]   b    1 4.976273

我想对cond 列中第一个1 之后的所有内容进行子集化。换句话说,所有大于3.143391a2.144755b(在此示例中)。

DT.sub <- DT[cond == "1",] # Please, combine this row
DT.sub[,.SD[dist==min(dist)],by=ind] # With this to make the code shorter, if you can.

  ind cond     dist
[1,]   a    1 3.143391
[2,]   b    1 2.144755

结果应该是这样的:

      ind cond     dist
 [1,]   a    0 3.937058
 [2,]   a    1 5.037681
 [3,]   a    2 6.036432
 [4,]   b    0 3.010903
 [5,]   b    2 3.937765
 [6,]   b    1 4.976273

【问题讨论】:

    标签: r subset data.table


    【解决方案1】:

    怎么样:

    DT[,.SD[seq(match(1,cond)+1,.N)],by=ind]
         ind cond     dist 
    [1,]   a    0 3.937058 
    [2,]   a    1 5.037681 
    [3,]   a    2 6.036432 
    [4,]   b    0 3.010903 
    [5,]   b    2 3.937765 
    [6,]   b    1 4.976273 
    

    顺便说一句,最好先set.seed(1),这样我们就可以处理相同的随机数据。

    【讨论】:

    • 谢谢!实际上,我一直在想,为什么人们在这里使用set.seed()。该命令的帮助表对我来说不是很容易理解...您知道data.table是否有很好的教程?
    • @Largh 我喜欢vignette('datatable-intro')vignette('datatable-faq') 的第一部分旨在从头到尾阅读。祝你好运!
    猜你喜欢
    • 2013-01-16
    • 2014-02-11
    • 2013-06-25
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2014-11-08
    相关资源
    最近更新 更多