首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dplyr汇总因子计数

使用dplyr汇总因子计数
EN

Stack Overflow用户
提问于 2014-09-12 23:28:35
回答 3查看 51.3K关注 0票数 21

我想按列(所有者)对数据帧进行分组,并输出一个新的数据帧,该数据帧包含每个观察值中每种类型的因子的计数。实际数据帧相当大,有10个不同的因素。

下面是一些示例输入:

代码语言:javascript
复制
library(dplyr)
df = tbl_df(data.frame(owner=c(0,0,1,1), obs1=c("quiet", "loud", "quiet", "loud"), obs2=c("loud", "loud", "quiet", "quiet")))

  owner  obs1  obs2
1     0 quiet  loud
2     0  loud  loud
3     1 quiet quiet
4     1  loud quiet

我正在寻找类似如下的输出:

代码语言:javascript
复制
out = data.frame(owner=c("0", "0", "1", "1"), observation=c("obs1", "obs2", "obs1", "obs2"), quiet=c(1, 0, 1, 2), loud=c(1, 2, 1, 0))

  owner observation quiet loud
1     0        obs1     1    1
2     0        obs2     0    2
3     1        obs1     1    1
4     1        obs2     2    0

融化让我走到了半路:

代码语言:javascript
复制
melted = tbl_df(melt(df, id=c("owner")))

  owner variable value
1     0     obs1 quiet
2     0     obs1  loud
3     1     obs1 quiet
4     1     obs1  loud
5     0     obs2  loud
6     0     obs2  loud
7     1     obs2 quiet
8     1     obs2 quiet

但是最后一步是什么呢?如果'value‘是一个数字,我会这样做:

代码语言:javascript
复制
melted %>% group_by(owner, variable) %>% summarise(counts=sum(value))

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-19 15:05:15

2017年的答案是

代码语言:javascript
复制
library(dplyr)
library(tidyr)

gather(df, key, value, -owner) %>%
  group_by(owner, key, value) %>%
  tally %>% 
  spread(value, n, fill = 0)

它给出了输出

代码语言:javascript
复制
Source: local data frame [4 x 4]
Groups: owner, key [4]

  owner   key  loud quiet
* <dbl> <chr> <dbl> <dbl>
1     0  obs1     1     1
2     0  obs2     2     0
3     1  obs1     1     1
4     1  obs2     0     2

2019年的答案是:

代码语言:javascript
复制
gather(df, key, value, -owner) %>% 
    count(owner, key, value) %>% 
    spread(value, n, fill = 0)
票数 29
EN

Stack Overflow用户

发布于 2014-09-12 23:45:16

您可以在dplyr中使用tidyr

代码语言:javascript
复制
library(dplyr)
library(tidyr)

 df %>%
 gather(observation, Val, obs1:obs2) %>% 
 group_by(owner,observation, Val) %>% 
 summarise(n= n()) %>%
 ungroup() %>%
 spread(Val, n, fill=0)

它给出了输出

代码语言:javascript
复制
  #    owner observation loud quiet
  #1     0        obs1    1     1
  #2     0        obs2    2     0
  #3     1        obs1    1     1
  #4     1        obs2    0     2
票数 29
EN

Stack Overflow用户

发布于 2015-12-12 09:08:21

如果你想放弃dplyr,你可以分成几个列表。

代码语言:javascript
复制
df <- split(df, list(df[[obs1]], df[[obs2]])

如果需要count,只需创建一个sapplylapply调用来遍历列表并获取每个列表的计数。或者你想要的任何其他函数。

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

https://stackoverflow.com/questions/25811756

复制
相关文章

相似问题

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