22

ソートキーが与えられた場合、 SAS および SPSS にある機能firstと機能を複製するための data.table ショートカットはありますか?last

以下の歩行者のアプローチは、グループの最初のレコードにフラグを立てます。

data.table の優雅さ (私は徐々に慣れてきました) を考えると、自己結合 & を使用したショートカットmultがあると思いますが、まだそれを理解しようとしています。

次に例を示します。

require(data.table)

set.seed(123)
n <- 17
DT <- data.table(x=sample(letters[1:3],n,replace=T),
                 y=sample(LETTERS[1:3],n,replace=T))
sortkey  <- c("x","y")
setkeyv(DT,sortkey)
key <- paste(DT$x,DT$y,sep="-")
nw <- c( T , key[2:n]!=key[1:(n-1)] )
DT$first <- 1*nw
DT
4

3 に答える 3

22

を使用したいくつかのソリューションを次に示しますdata.table

## Option 1 (cleaner solution, added 2016-11-29)
uDT <- unique(DT)
DT[, c("first","last"):=0L]
DT[uDT, first:=1L, mult="first"]
DT[uDT, last:=1L, mult="last"]


## Option 2 (original answer, retained for posterity)
DT <- cbind(DT, first=0L, last=0L)
DT[DT[unique(DT),,mult="first", which=TRUE], first:=1L]
DT[DT[unique(DT),,mult="last", which=TRUE], last:=1L]

head(DT)
#      x y first last
# [1,] a A     1    1
# [2,] a B     1    1
# [3,] a C     1    0
# [4,] a C     0    1
# [5,] b A     1    1
# [6,] b B     1    1

明らかに、これらの各行には多くのことが詰め込まれています。ただし、重要な構造は次のとおりです。これは、各グループの最初のレコードの行インデックスを返します。

DT[unique(DT),,mult="first", which=TRUE]
# [1]  1  2  3  5  6  7 11 13 15
于 2012-05-07T05:21:35.353 に答える
10

1 つの簡単な方法は、duplicated()関数を使用することです。データフレームに適用すると、データフレームを下に移動するときに、行値の組み合わせが以前に発生していない場合にのみ、エントリが TRUE であるベクトルが生成されます。

DT$first <- !duplicated( DT[, list(x,y) ])                                                                                                                                                                                                                                    
DT$last <- rev(!duplicated( DT[, list(rev(x),rev(y)) ]))                                                                                                                                                                                                                      

> DT                                                                                                                                                                                                                                                                         
       x y first  last                                                                                                                                                                                                                                                        
  [1,] a A  TRUE  TRUE                                                                                                                                                                                                                                                        
  [2,] a B  TRUE  TRUE                                                                                                                                                                                                                                                        
  [3,] a C  TRUE FALSE                                                                                                                                                                                                                                                        
  [4,] a C FALSE  TRUE                                                                                                                                                                                                                                                        
  [5,] b A  TRUE  TRUE                                                                                                                                                                                                                                                        
  [6,] b B  TRUE  TRUE                                                                                                                                                                                                                                                        
  [7,] b C  TRUE FALSE                                                                                                                                                                                                                                                        
  [8,] b C FALSE FALSE                                                                                                                                                                                                                                                        
  [9,] b C FALSE FALSE                                                                                                                                                                                                                                                        
 [10,] b C FALSE  TRUE                                                                                                                                                                                                                                                        
 [11,] c A  TRUE FALSE                                                                                                                                                                                                                                                        
 [12,] c A FALSE  TRUE                                                                                                                                                                                                                                                        
 [13,] c B  TRUE FALSE                                                                                                                                                                                                                                                        
 [14,] c B FALSE  TRUE                                                                                                                                                                                                                                                        
 [15,] c C  TRUE FALSE                                                                                                                                                                                                                                                        
 [16,] c C FALSE FALSE                                                                                                                                                                                                                                                        
 [17,] c C FALSE  TRUE            

使用しない別の方法duplicated()は次のとおりです。

DT[ unique(DT), list(first = c(1, rep(0,length(y)-1)),                                                                                                                                                                                                                        
                     last =  c(rep(0,length(y)-1),1 )) ]      

      x y  first last                                                                                                                                                                                                                                                   
  [1,] a A     1    1                                                                                                                                                                                                                                                         
  [2,] a B     1    1                                                                                                                                                                                                                                                         
  [3,] a C     1    0                                                                                                                                                                                                                                                         
  [4,] a C     0    1                                                                                                                                                                                                                                                         
  [5,] b A     1    1                                                                                                                                                                                                                                                         
  [6,] b B     1    1                                                                                                                                                                                                                                                         
  [7,] b C     1    0                                                                                                                                                                                                                                                         
  [8,] b C     0    0                                                                                                                                                                                                                                                         
  [9,] b C     0    0                                                                                                                                                                                                                                                         
 [10,] b C     0    1                                                                                                                                                                                                                                                         
 [11,] c A     1    0                                                                                                                                                                                                                                                         
 [12,] c A     0    1                                                                                                                                                                                                                                                         
 [13,] c B     1    0                                                                                                                                                                                                                                                         
 [14,] c B     0    1                                                                                                                                                                                                                                                         
 [15,] c C     1    0                                                                                                                                                                                                                                                         
 [16,] c C     0    0                                                                                                                                                                                                                                                         
 [17,] c C     0    1          
于 2012-05-06T21:47:17.177 に答える
2

ジョシュよりも簡単な方法かもしれません

unique(DT)
unique(DT,fromLast=TRUE]
于 2014-09-01T18:42:24.813 に答える