r-如何在不使脚本过大的情况下同时计算多个百分比



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

相关内容

最新更新