在data.table中分组后的部分和

时间:2015-10-05 19:15:48

标签: r group-by data.table

让我们假设我们获得以下数据:

array_view

基本上我们计算每个夸克和每个字母对应的观察数量,使用库library(data.table) letters <- sample (LETTERS[1:6], 100, replace = TRUE) quarks <- sample(c("up", "down", "charme", "strange", "top", "bottom"), 100, replace = TRUE) measures<- sample(seq(1:6), 100, replace = TRUE) df <- data.frame(letters, quarks, measures) df <- data.table(df) df <- df[,.(count = sum(measures)), by = list(letters, quarks)] df letters quarks count --------------------------- 1: A bottom 13 2: A charme 3 3: A down 14 4: A strange 8 5: A top 11 6: A up 14 7: B bottom 8 8: B charme 12 9: B down 3 提供的[.,]函数进行分组。

问题我想在此附上一个新列,显示每个字母的度量总数,以便将每个夸克标准化为具有相同字母的数量。特别地,这可以通过以下方式单独获得:

data.table

通过这种方式,每个单夸克的每个计数都可以被划分并标准化为我们与同一个字母相关的总夸克数。有没有办法实现这一点仍然使用df[,.(count = sum(measures)), by = letters] letters count 1: F 54 2: E 65 3: B 71 4: D 36 5: C 82 6: A 45

2 个答案:

答案 0 :(得分:3)

您可以通过链接一个新的摘要来实现这一点,在该摘要中,您只按getDepotInfo : function (depotCode) { var deferred = $q.defer(); var oneDepInfo = {}; $http.get("data/depotList.json").success(function (data) { some code... }).then(function(){ $http.jsonp("http://urlhere").success(function (response) { additional code... deferred.resolve(oneDepInfo); }) }); return deferred.promise; } 分组到第一个摘要,如下所示:

letters

这给出了:

dfnew <- df[,.(count = sum(measures)), by = list(letters, quarks)
            ][, lettercount := sum(count) , by = letters]

如果你想要一个比率(比如答案中显示的@Arun)而不是字母总和,你可以用> dfnew letters quarks count lettercount 1: A strange 16 30 2: A down 8 30 3: A top 5 30 4: A charme 1 30 5: B strange 13 43 6: B bottom 9 43 7: B top 14 43 8: B charme 6 43 9: B down 1 43 10: C charme 24 73 11: C up 7 73 12: C down 11 73 13: C strange 18 73 14: C top 3 73 15: C bottom 10 73 16: D down 8 41 17: D charme 3 41 18: D bottom 7 41 19: D up 10 41 20: D strange 4 41 21: D top 9 41 22: E charme 12 77 23: E up 8 77 24: E top 8 77 25: E strange 21 77 26: E bottom 13 77 27: E down 15 77 28: F bottom 14 45 29: F down 11 45 30: F up 10 45 31: F strange 8 45 32: F charme 2 45 替换lettercount := sum(count)

使用过的数据:

ratio := count/sum(count)

答案 1 :(得分:2)

另一种方法是使用.SD 组在每个组中,如下所示:

require(data.table)
ans = df[, .(ratio=.SD[, .(tmp=sum(measures)), by=quarks]$tmp/sum(measures)), by=letters]
head(ans)
#    letters      ratio
# 1:       C 0.20588235
# 2:       C 0.13235294
# 3:       C 0.35294118
# 4:       C 0.04411765

我仍然更喜欢@Jaap显示的答案,除了我们可以直接获得比率而不是创建 lettercount 列。