4

私はdata.tableのドキュメントを理解しようとしていますが、次のことに関する私の推論が間違っている場合は、フィードバックを求めたいと思います.

(1) data.table から列の範囲を選択して、新しい data.table を作成したいと考えています。

(2) また、各グループの最初の値だけを取得したいと思います。最初の質問に関しては、答えはここにあると思いますが、次に列番号に関してです。しかし、列名を使用したいと思います。これは、data.table の主な強み (およびセールス ポイント) の 1 つだと思います。

データセットの例を次に示します。

DT <- data.table(ID=c(101,101,101,102,103,104,104),
                 "year.1" = c(1,5,3,2,3,4,8), 
                 "year.2" = c(4,5,6,NA,1,2,3), 
                 "year.3" = c(1,2,3,7,9,8,0), 
                 "year.4" = c(4,5,NA,1,2,6,9))
setkey(DT,ID)

実際には、「年」だけでなく、もっと多くの列があります。

# ALL OF THESE DONT WORK AND END IN ERRORS
# To extract a range of columns I have tried this:
dt.sub <- DT[,list(year.1:year.3,ID)]
dt.sub <- DT[,c("year.1":"year.3",ID), with=FALSE] # I know shouldn't work since 
# "with=FALSE" is only intended in combination with := according to the documentation
dt.sub <- DT[,lapply(SD),.SDcols= for (i in 1:3) paste0("year.",i) ]

2 番目の質問: dt.sub に各グループの最初の観測のみを含めたい場合は、"mult" 引数を使用できると思います。ただし、これは私が予想するものとは異なる方法でも機能します。1 つの列だけで例を使用すると、次のようになります。

dt.sub1 <- DT[,year.1, by=ID,mult="first",]

これはエラーを提供しませんが、グループの最初の行を提供するだけではありません。次のような回避策があることを知っています:

dt.sub1 <- unique(DT[,year.1, by=ID])

期待される出力を提供しますが、オプションで重要なものが欠けているように感じmultます。

4

1 に答える 1

7
# (1)
DT[, c(paste0('year.', 1:3), 'ID'), with = F]

# (2) 
DT[, year.1[1], by = ID]

mult2 つの data.tables をマージ/結合するときに使用され、複数の一致が存在する場合に何をすべきかを示します。したがって、@Arun が指摘したようにmult、2 番目の質問に使用する方法は次のようになります (すでに によってキーが設定されている場合ID):

DT[J(unique(ID)), list(ID, year.1), mult = 'first']
于 2013-07-18T18:30:53.393 に答える