mtcars数据集包含变量"碳水化合物;与化油器的数量。首先,我想知道有多少辆车有1、2、3等化油器。我用了dplyr动词count((。
library(dplyr)
df <- mtcars
N <- df %>%
count(carb)
结果是:
> N
carb n
1 1 7
2 2 10
3 3 3
4 4 10
5 6 1
6 8 1
然后我想知道,有多少辆1碳水化合物、2碳水化合物、开关3等的汽车有4、6或8缸。
例如:我使用filter((通过使用来计算1碳水化合物和4气缸的汽车总数
carb1cyl4 <- df %>%
filter(carb == 1, cyl == 4) %>%
count() %>%
rename(carb1cyl4 = n)
结果是:
carb1cyl4
1 5
我对6个和8个气缸做了同样的操作,结果如下:
carb1cyl6
1 2
carb1cyl8
1 0
如果我对所有碳水化合物继续这样做,我可以进行一些_rows和_cols绑定,然后通过使用mutate(carbXcylX/N(计算具有一定数量碳水化合物和气缸的汽车的百分比,所以基本上是将每个碳水化合物/气缸组合的汽车数量除以具有相应碳水化合物数量的汽车数量。
问题是,如果我继续这样做,我的数据集要大得多,而且需要很长时间,而且很容易出错。有其他计算方法吗?
最终结果应该是这样的。
carb n perc1cy4 perc1cy6 perc1cy8
1 1 7 0.7142857 0.2857143 0
提前谢谢!
使用表:
cbind(n = table(mtcars$carb),
prop.table(with(mtcars, table(carb, cyl)), margin = 1))
# n 4 6 8
# 1 7 0.7142857 0.2857143 0.0
# 2 10 0.6000000 0.0000000 0.4
# 3 3 0.0000000 0.0000000 1.0
# 4 10 0.0000000 0.4000000 0.6
# 6 1 0.0000000 1.0000000 0.0
# 8 1 0.0000000 0.0000000 1.0
我可能建议用之类的东西制作一个组大小的列
count_df <- df %>% count(carb, cyl) %>% rename(n = group_size)
然后你可以内部连接到表
inner_join(df, count_df, by = c("carb", "cyl")
然后用计算百分比
mutate(perc = (n/group_size) * 100)
这可以变得更简洁,但这里有一个起点,使用summarise
mtcars %>%
group_by(carb) %>%
summarise(n(),
sum(cyl == 4),
sum(cyl == 6),
sum(cyl == 8),
mean(cyl == 4),
mean(cyl == 6),
mean(cyl == 8))
#> # A tibble: 6 x 8
#> carb `n()` `sum(cyl == 4)` `sum(cyl == 6)` `sum(cyl == 8)` `mean(cyl == 4)` `mean(cyl == 6)` `mean(cyl == 8)`
#> <dbl> <int> <int> <int> <int> <dbl> <dbl> <dbl>
#> 1 1 7 5 2 0 0.714 0.286 0
#> 2 2 10 6 0 4 0.6 0 0.4
#> 3 3 3 0 0 3 0 0 1
#> 4 4 10 0 4 6 0 0.4 0.6
#> 5 6 1 0 1 0 0 1 0
#> 6 8 1 0 0 1 0 0 1