,我有以下数据表:高效的方式
require(data.table)
dt1 <- data.table(ind = 1:8, cat = c("A", "A", "A", "B", "B", "C", "C", "D"), counts = (10:3))
ind cat counts
1: 1 A 10
2: 2 A 9
3: 3 A 8
4: 4 B 7
5: 5 B 6
6: 6 C 5
7: 7 C 4
8: 8 D 3
我想达成什么是增加一排这在计数有每只猫猫和猫A.对于这些行的总和(计数)的总和(计数)之间差异的IND应该是0 基本上我想rbind以下信息:
added_info <- cbind(ind =0, dt1[, .(counts = dt1[cat == "A", sum(counts)] - sum(counts)), by = cat])
> added_info
ind cat counts
1: 0 A 0
2: 0 B 14
3: 0 C 18
4: 0 D 24
而结束结果将是:
dt1 <- rbind(dt1, added_info)[order(cat)]
> dt1
ind cat counts
1: 1 A 10
2: 2 A 9
3: 3 A 8
4: 0 A 0
5: 4 B 7
6: 5 B 6
7: 0 B 14
8: 6 C 5
9: 7 C 4
10: 0 C 18
11: 8 D 3
12: 0 D 24
我的问题是,如果有实现这一目标使用的数据表的一个更好的(更短)的方式(比如用.I或.N?)
如果猫的计数的总和存储在'x'你可以使用'rbind(DT1,DT1 [做到一步到位,(IND = 0,计数= X - 总和(计数)) ,by = cat],use.names = TRUE)''但我认为这不会有很大的区别 –
也许'dt1 [,c:= sum(counts [cat ==“A”])] [,。( ind = c(ind,0),counts = c(counts,c [.N] -counts [.N])),cat] []'? – lukeA
@docendodiscimus是的,你是对的没有显着差异。 @lukeA这并不是我想要的,但是通过将它改为'dt1 [,c:= sum(counts [cat ==“A”])] [,。(ind = c(ind,0),count = c(counts,c [.N] -sum(counts))),cat] []'这给了我期待的结果 – User2321