r - 按每个组中的子组汇总(&group by)
问题描述
总之,我试图在喜欢苹果的人群和不喜欢苹果的人群中获得国籍的百分比(如果这个人喜欢,Apple==1,如果不喜欢,Apple==0)。我使用此代码,但百分比不是我想要的:
sample %>%
group_by(Apple,Country) %>%
dplyr::summarise(count=n())%>%
mutate(pct_gender=count/sum(count))
我从这段代码中得到的是国籍+苹果在所有观察中的百分比。(例如,在所有 31 次观察中,有 18 人喜欢苹果。在喜欢苹果的 18 人中,有 7 人来自法国。所以我想得到 7/18=38.8%,但我得到的结果是 7/31=22.6% )
这是我使用的数据:
structure(list(id = 1:30, Country = c("USA", "USA", "USA", "USA",
"USA", "USA", "USA", "USA", "Germany", "Germany", "Germany",
"Germany", "Germany", "Germany", "UK", "UK", "UK", "UK", "UK",
"UK", "UK", "UK", "UK", "UK", "France", "France", "France", "France",
"France", "France"), Apple = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L,
1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L,
1L, 1L, 1L, 1L, 1L, 1L), Banana = c(1L, 1L, 0L, 1L, 1L, 0L, 0L,
1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L,
1L, 1L, 0L, 0L, 0L, 1L, 1L), Orange = c(0L, 0L, 0L, 0L, 0L, 1L,
1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L,
1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L), Jackfruit = c(0L, 0L, 1L, 1L,
0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L,
1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L)), row.names = c(NA, -30L
), class = c("tbl_df", "tbl", "data.frame"))
如果有人能让我知道我做错了什么,我将不胜感激。
解决方案
我同意@Ronak Shah,这在基础上比任何其他软件包都容易:
使用table
(如 Ronak 建议的那样),但也 prop.table
使用:
prop.table(table(df$Country, df$Apple), margin = 2)
产生:
0 1
France 0.0000000 0.3529412
Germany 0.3076923 0.1176471
UK 0.4615385 0.2352941
USA 0.2307692 0.2941176
请注意,您不应该期望法国有 38.8% - 喜欢(在您的玩具数据中,在 17 个人中,只有 6 个法国人喜欢苹果)。
推荐阅读
- python - django 模型中的 OneToManyRelationship
- xmlhttprequest - REST 服务令牌的身份验证标头
- typescript - Return 语句比量角器中的代码更早执行
- asp.net-mvc - 仅为更新的文件创建 nuget 包
- maven - 无法使用 Gradle 插件在 Jenkins 中获取类型为 DefaultGroovyMavenDeployer 的对象的未知属性
- elasticsearch - Elasticsearch 查询 - 组合查询
- vue.js - Vuex mapState 设置状态
- sqlite - SQLite 返回的最小值大于最大值
- c++ - 无法编译 C++ 代码
- javascript - 跟踪html5视频控制区域中的点击播放按钮