【问题标题】:How to sum categorical variable across variables [duplicate]如何跨变量求和分类变量[重复]
【发布时间】:2019-10-07 06:25:49
【问题描述】:

我的数据集是这样的

df<-read.table(text="group, race
               1, 1
               1, 1
               1, 4
               2, 1
               2, 3
               2, 4
               3, 1
               2, 1
               1, 1", header=T, sep=",")

我想得到每组每场比赛的总和。我尝试过使用聚合函数,但无济于事

我希望输出看起来像这样:

group   race   total
1       1      2
1       4      1
2       1      2
.
.
.
3       1      1

【问题讨论】:

  • 可能你需要df %&gt;% count(group, race)
  • 计数总和是什么意思?这看起来像是您可以计算每个组和种族的值的数据,但我不确定您会总结什么。您的输出与您的数据不完全匹配:第 1 组,第 1 场比赛发生 3 次,而不是 2 次​​span>
  • 在早期版本的@akrun 评论中:df %&gt;% add_count(group, race)ave() 做同样的事情。
  • as.data.frame(table(df$group, df$race))
  • @Cath 可能是 as.data.frame(table(group=df$group, race=df$race))as.data.frame(table(df)) 以保留名称。

标签: r dataframe aggregate


【解决方案1】:

可以使用aggregate()在base中完成:

with(df, aggregate(list(count=race), by=list(group=group,race=race), FUN=length))

#>   group race count
#> 1     1    1     3
#> 2     2    1     2
#> 3     3    1     1
#> 4     2    3     1
#> 5     1    4     1
#> 6     2    4     1

或使用ave()(如果您想保留您的数据结构并添加列total):

df$total <- ave(df$race, df[,c("group","race")], FUN=length)

#>   group race total
#> 1     1    1     3
#> 2     1    1     3
#> 3     1    4     1
#> 4     2    1     2
#> 5     2    3     1
#> 6     2    4     1
#> 7     3    1     1
#> 8     2    1     2
#> 9     1    1     3

【讨论】:

  • aggregate(list(count = df$race), df, length)
【解决方案2】:
library(tidyverse)

df<-tribble(~"group", ~"race",
               1, 1,
               1, 1,
               1, 4,
               2, 1,
               2, 3,
               2, 4,
               3, 1,
               2, 1,
               1, 1)
df %>% 
    count(group, race)
#> # A tibble: 6 x 3
#>   group  race     n
#>   <dbl> <dbl> <int>
#> 1     1     1     3
#> 2     1     4     1
#> 3     2     1     2
#> 4     2     3     1
#> 5     2     4     1
#> 6     3     1     1

reprex package (v0.2.1) 于 2019-05-20 创建

【讨论】:

    【解决方案3】:

    类似于dylanjm,但逻辑略有不同:

    df %>%
    group_by(group, race) %>%
    summarise(Total = length(race))
    

    产生相同的结果:

    # A tibble: 6 x 3
    # Groups:   group [?]
      group  race Total
      <int> <int> <int>
    1     1     1     3
    2     1     4     1
    3     2     1     2
    4     2     3     1
    5     2     4     1
    6     3     1     1
    

    【讨论】:

    • 使用length而不是sum
    • 谢谢 - 这就是多任务处理的危险。
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多