汇总一列,在R中按另一列分组

时间:2018-11-26 20:37:53

标签: r dplyr

我相信这是一个简单的问题,我想我只是没有能力从逻辑上考虑它以进行搜索。

我有一个数据表:

Column 1: Sex (M/F)
Column 2 Plays Sport (Y/N)

我需要一个摘要表,其中显示:

Sex | Plays Sport Yes | Plays Sport No

我无法终生解决如何使用dplyr做到这一点。

如果不太复杂,则最好使用基r中的解决方案。

3 个答案:

答案 0 :(得分:2)

使用dplyr并对您要查找的内容进行一些假设:

library(tidyverse)

data <- data.frame(Sex = c("M", "F")[rbinom(10, 1, 0.5) + 1],
                   PlaysSport = c(TRUE, FALSE)[rbinom(10, 1, 0.5) + 1])

data %>% 
  group_by(Sex, PlaysSport) %>% 
  summarise(count = n())

# A tibble: 4 x 3
# Groups:   Sex [?]
      Sex   PlaysSport count
    <fctr>    <lgl>    <int>
1      F      FALSE     1
2      F       TRUE     3
3      M      FALSE     4
4      M       TRUE     2

答案 1 :(得分:2)

我们可以将countspread一起使用

library(tidyverse)
df1 %>%
   count(Sex, Sport) %>% 
   spread(Sport, n, fill = 0)
# A tibble: 2 x 3
#  Sex       N     Y
#   <chr> <dbl> <dbl>
#1 F         2     0
#2 M         3     1

数据

df1 <- data.frame(Sex = c("M", "M", "F", "M", "M", "F"),
            Sport = c("N", "Y", "N", "N", "N", "N"), stringsAsFactors = FALSE)

答案 2 :(得分:0)

您可以使用table

# dummy data
df1 <- data.frame(Sex = c("M", "M", "F", "M", "M", "F"),
                Sport = c("N", "Y", "N", "N", "N", "N"), stringsAsFactors = FALSE)
df1
#  Sex Sport
#1   M     N
#2   M     Y
#3   F     N
#4   M     N
#5   M     N
#6   F     N

结果

table(df1)
#   Sport
#Sex N Y
#  F 2 0
#  M 3 1

这里是reshape2::dcast

的另一个选项
reshape2::dcast(df1, Sex ~ paste0("Sport_", Sport), 
                fun.aggregate = length # default 
                )

结果

#  Sex Sport_N Sport_Y
#1   F       2       0
#2   M       3       1