dplyr汇总(汇总)几个共享相同“级别”变量的方法

时间:2018-09-28 16:28:40

标签: r dplyr

dplyr来制表几个共享相同“级别”以产生以下输出的变量的方法是什么?

df <- data.frame(v1 = c("sometimes", "sometimes", "rarely", "never", "often",
                        "often"),
                 v2 = c("often", "sometimes", "rarely", "never", "rarely",
                        "often"))

tab <- data.frame(cbind(table(df$v1), table(df$v2)))
names(tab) <- names(df) 
tab

#          v1 v2
#never      1  1
#often      2  2
#rarely     1  2
#sometimes  2  1

2 个答案:

答案 0 :(得分:3)

您可以使用这种方法:

use ConsoleTVs\Charts\Classes\ChartJs\Chart;

@Frank指出,您可以直接使用> df %>% gather(var) %>% group_by(var) %>% count(value) %>% spread(var, n) # A tibble: 4 x 3 value v1 v2 <chr> <int> <int> 1 never 1 1 2 often 2 2 3 rarely 1 2 4 sometimes 2 1 ,而无需使用group_by,按组进行计数,如下所示:

count()

答案 1 :(得分:1)

一种方法是将数据转换为“长”格式,这样可以更轻松地简单地计算标签的出现次数,然后spread将它们转换为所需的格式。

df.count <- df %>% 
  gather(variable, value) %>% 
  group_by(variable, value) %>% 
  count %>% 
  spread(variable, n)

  value        v1    v2
  <chr>     <int> <int>
1 never         1     1
2 often         2     2
3 rarely        1     2
4 sometimes     2     1

当然,dplyr并非绝对必要:

df2 <- sapply(df, table)

这将产生一个命名矩阵,而不是数据帧:

          v1 v2
never      1  1
often      2  2
rarely     1  2
sometimes  2  1

通过更多的工作,您可以将其转换为数据框:

df2 <- sapply(df, table) %>% 
  as.data.frame %>% 
  rownames_to_column(var = 'level')