Warm tip: This article is reproduced from serverfault.com, please click

table() function in r-有没有更好的方法,例如dplyr?

(table() function in r - is there a better way with e.g., dplyr?)

发布于 2020-12-02 11:06:40

我正在尝试创建一个基本表,该表的分类变量(Relationship_type)的频率由另一个变量(Country)分组,最好使用dplyr库(或其他比table()更容易导出为.csv文件的文件)。

head(d)
Country                        Relationship_type
1 Algeria                                      2
2 Bulgaria                                     1
3 USA                                          2
4 Algeria                                      3
5 Germany                                      2
6 USA                                          1

我希望这看起来像基本表(d $ Country,d $ Relationship_type)函数的输出:

                    2   3   4
  Algeria         141  47 137
  Australia       128  27 103
  Austria          97   5  17
  Belgium         172  16  71
  Brazil          104   6  70
  CHILE            54   4  46

尝试了tally(),group_by,count()等的几种组合,但无法弄清楚。

你能帮忙一点吗?

祝一切顺利,R_beginner

Questioner
chillos
Viewed
11
Len Greski 2020-12-02 19:59:10

另一种方法是使用tables::tabular()如下。

textData <- "id Country                        Relationship_type
1 Algeria                                      2
2 Bulgaria                                     1
3 USA                                          2
4 Algeria                                      3
5 Germany                                      2
6 USA                                          1
7 Algeria                                      1
8 Bulgaria                                     3
9 USA                                          2
10 Algeria                                     2
11 Germany                                     1
12 USA                                         3"

df <- read.table(text=textData,header=TRUE)
library(tables)
tabular(Factor(Country) ~ Factor(Relationship_type),data=df)

...以及输出:

          Relationship_type    
 Country  1                 2 3
 Algeria  1                 2 1
 Bulgaria 1                 0 1
 Germany  1                 1 0
 USA      1                 2 1

还有另一种方法是将输出重铸table()为数据帧,并使用将其旋转到更宽的范围tidyr::pivot_wider()

# another approach: recast table output as data.frame
tableData <- data.frame(table(df$Country,df$Relationship_type))
library(dplyr)
library(tidyr)
tableData %>% 
     pivot_wider(id_cols = Var1,
                 names_from = Var2,
                 values_from = Freq)

...以及输出:

> tableData %>% 
+      pivot_wider(id_cols = Var1,
+                  names_from = Var2,
+                  values_from = Freq)
# A tibble: 4 x 4
  Var1       `1`   `2`   `3`
  <fct>    <int> <int> <int>
1 Algeria      1     2     1
2 Bulgaria     1     0     1
3 Germany      1     1     0
4 USA          1     2     1

如果将a添加dplyr::rename()到管道中,则可以将该Var1重命名Country

tableData %>% 
     pivot_wider(id_cols = Var1,
                 names_from = Var2,
                 values_from = Freq) %>%
     rename(Country = Var1)

和往常一样,R中有很多方法可以完成此任务。根据所需输出是CSV文件的原因,有多种方法可以满足要求。如果最终目标是创建演示文稿质量表,那么值得一看以下创建演示文稿质量表的程序包摘要:gt如何与其他创建显示表的程序包配合