3

data.tableRで(パッケージ)をサブセット化しようとして苦労しています。次の例を示します

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

1最初のcond列の後にすべてをサブセット化したい。3.143391つまり、 foraおよび2.144755forよりも大きいすべてのものb(この例では)。

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
4

1 に答える 1

3

どうですか :

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)同じランダム データで作業できるように、最初に行うのは良いことです。

于 2012-06-27T12:55:14.320 に答える