[英]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.