我正在尝试创建一个基本表,该表的分类变量(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
另一种方法是使用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如何与其他创建显示表的程序包配合。
谢谢您的回答!我一定会检查gt :)该表格在每一个Relationship_type列中只给了我一个,因为我有来自给定国家的众多参与者,如我在第一篇文章中添加的table()输出所示(而不是二进制文件)是或否),因此我认为无论如何都不会改善当前的情况。!!尚未注意到您的关键建议。那就是我一直在寻找的,谢谢!
@chillos-感谢您的反馈。我已经更新了答案。如果删除*(N = 1),
tabular()
将自动计算观测值的数量。我还添加了测试数据,以证明更新的解决方案有效,正如您从输出中看到的那样,这两个解决方案现在在表单元格中总共有12个计数,其中一些计数大于1。