首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用百分比计算分组频次表

用百分比计算分组频次表
EN

Stack Overflow用户
提问于 2016-02-26 11:55:29
回答 3查看 5.8K关注 0票数 1

给出下面的data.frame,我想通过分组变量GROUP来计算每个VAR变量的出现情况和这些变量的出现百分比。

代码语言:javascript
运行
复制
GROUP<-c("G1","G2","G1","G2","G3","G3","G1")
VAR<-c("A","B","B","A","B","B","A")
d<-data.frame(GROUP,VAR)

使用table(),我得到了一个很好的频度表,计算了这两个变量的所有组合的出现情况:

代码语言:javascript
运行
复制
d<-as.data.frame(table(d))
  GROUP VAR Freq
1    G1   A    2
2    G2   A    1
3    G3   A    0
4    G1   B    1
5    G2   B    1
6    G3   B    2

现在,我想通过VAR通过GROUP计算每个变量的百分比。到目前为止,我将data.frame除以GROUP,并分别计算G1G2G3的百分比,然后将其合并。

代码语言:javascript
运行
复制
d.G1<-d[d$GROUP=="G1",]
d.G1$per<-d.G1$Freq/sum(d.G1$Freq)
d.G1
  GROUP VAR Freq       per
1    G1   A    2 0.6666667
4    G1   B    1 0.3333333

..。

代码语言:javascript
运行
复制
d.merge<-rbind(d.G1,d.G2,d.G3)
d.merge 
GROUP VAR Freq       per
1    G1   A    2 0.6666667
4    G1   B    1 0.3333333
2    G2   A    1 0.5000000
5    G2   B    1 0.5000000
3    G3   A    0 0.0000000
6    G3   B    2 1.0000000

是否有更优雅的解决方案,例如使用reshape2包?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-26 12:15:14

对于dplyr包,您可以:

代码语言:javascript
运行
复制
require(dplyr)

d <- d %>% group_by(GROUP) %>% mutate(per = Freq/sum(Freq))
票数 2
EN

Stack Overflow用户

发布于 2016-02-26 12:29:26

这个答案来自@lukeA的一个评论,如果你只需要百分比的话,我认为这是一个非常优雅的解决方案:

代码语言:javascript
运行
复制
d<-as.data.frame(prop.table(table(d),1))
票数 2
EN

Stack Overflow用户

发布于 2016-02-26 12:37:49

使用data.table,您可以如下所示:

代码语言:javascript
运行
复制
library(data.table)
GROUP<-c("G1","G2","G1","G2","G3","G3","G1")
VAR<-c("A","B","B","A","B","B","A")
DT <-data.table(GROUP,VAR)

# Create count 
DT1 <- DT[, list(Count=.N), by=.(GROUP, VAR)]
# melt and dcast to get all combinations of GROUP and VAR
# as in your output. You can remove it if all combinations 
# not required
DT2 <- dcast(DT1, GROUP ~ VAR)
DT3 <- melt(DT2,  id.var="GROUP")
# Replace na values with zero
DT3[,lapply(.SD,function(x){ifelse(is.na(x),0,x)})]
# Create percentage
DT3[, percent:=value/sum(value, na.rm=TRUE), by=GROUP]

我试图将输出保持为您的输出。因此,必须做铸造和融化。如果不需要,可以省略这些内容。

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

https://stackoverflow.com/questions/35651058

复制
相关文章

相似问题

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