簡體   English   中英

與data.table分組后獲取row.name

[英]Get row.name after grouping with data.table

我是data.table的新手,但我設法將60萬行數據集中的計算量從數千秒(使用* ply循環)減少到1.7sec。 基本上,我需要在同一的組中的列中具有最低值的行並開始 我正在使用

DT[, list(class=min(class)), by=list(group, start)]

但是要做到這一點,我從data.frame中創建了僅包含這三列的DT,其中包含更多列。 因此,為了將結果與原始data.frame合並,我正在考慮使用row.name,因此我創建了具有row.name = TRUE的 DT,這是我所擁有的示例:

   group   start     class     rn
 1:  A      4943         4      1
 2:  A      5030         0      2
 3:  A      5030         4      3
 4:  A      5030         2      4
 5:  A      5083         4      5
 6:  A      5083         3      6
 7:  B      5041         0      7
 8:  B      5041         1      8
 9:  B      5083         4      9
 ...

我期望的結果只是對應於最小值的rn

   group   start     class     rn
 1:  A      4943         4      1
 2:  A      5030         0      2
 3:  A      5083         3      6
 4:  B      5041         0      7
 5:  B      5083         4      9
 ...

但是,如果我使用:

DT[, list(class=min(class)), by=list(group, start, rn)]

要么

DT[, list(class=min(class), rn), by=list(group, start)]

我得到所有行,不僅是最少的行。

額外的問題

我可以使用我的命令使用data.table sintax獲取組中每個類類型的情況的計數?

   group   start     class     rn    class0    class1    class2    class3    class4
 1:  A      4943         4      1         0         0         0         0         1
 2:  A      5030         0      2         1         0         1         0         1
 3:  A      5083         3      6         0         0         0         1         1
 4:  B      5041         0      7         1         1         0         0         0
 5:  B      5083         4      9         0         0         0         0         1
 ...

對於第一個問題,您基本上是在每個組上呼叫min 這不是必需的。 如果還對列class排序(通過設置key ),則可以使用mult="first"功能直接選擇最小的元素。 那是,

setkey(dt, group, start, class)
dt[CJ(unique(group), unique(start)), mult="first", nomatch=0]
   group start class rn
1:     A  4943     4  1
2:     A  5030     0  2
3:     A  5083     3  6
4:     B  5041     0  7
5:     B  5083     4  9

另外,如果您不想在這里使用CJ ,則可以執行以下操作:

setkey(dt, group, start, class)
dt[, list(class=class[1], rn=rn[1]), by=list(group, start)]

編輯2:

這是一個完整的答案:

dt.out <- dt[, c(list(class = class[1], rn=rn[1]), 
       {tt <- rep(0,5); tt[class+1] <- 1; as.list(tt)}), by=list(group, start)]
setnames(dt.out, 5:9, paste0("Class", 0:4))

   group start class rn Class0 Class1 Class2 Class3 Class4
1:     A  4943     4  1      0      0      0      0      1
2:     A  5030     0  2      1      0      1      0      1
3:     A  5083     3  6      0      0      0      1      1
4:     B  5041     0  7      1      1      0      0      0
5:     B  5083     4  9      0      0      0      0      1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM