首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >data.table中分组后的部分和

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

Stack Overflow用户
提问于 2015-10-05 19:15:48
回答 2查看 393关注 0票数 1

让我们假设我们得到了以下数据:

代码语言:javascript
复制
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函数进行分组。

问题:,我想用一个新的列来显示每一个字母的总测量数,这样每个夸克被标准化到有多少个有相同的字母。具体而言,这可以通过以下方式获得:

代码语言:javascript
复制
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

这样,每一个夸克的每一个计数都可以被划分并归一化为我们与同一个字母相关联的夸克总数。是否仍然可以使用data.table实现这一目标?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-05 19:27:58

您可以通过链接一个新的摘要来实现这一点,其中您只按letters分组到您的第一个摘要如下:

代码语言:javascript
复制
dfnew <- df[,.(count = sum(measures)), by = list(letters, quarks)
            ][, lettercount := sum(count) , by = letters]

这意味着:

代码语言:javascript
复制
> 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

如果您想要一个比率(如@Arun在他的答复中显示的),而不是按字母表示的和,您可以用lettercount := sum(count)替换为ratio := count/sum(count)

使用的数据:

代码语言:javascript
复制
set.seed(1)
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.table(letters, quarks, measures)[order(letters)]
票数 3
EN

Stack Overflow用户

发布于 2015-10-05 19:55:30

另一种方法是使用.SD对每个组进行分组,如下所示:

代码语言:javascript
复制
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所显示的答案,但我们可以直接获得比率,而不是创建字母计数列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32956171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档