如何最好地使用 dplyr 对数据进行子集化并创建相对频率表?
How can I best use dplyr to subset data and create relative frequency tables?
我正在使用 iris
数据集来学习如何使用 dplyr
,并且正在尝试创建一个相对频率 table,如下所示:
Petal.Width
.1
.2
.3
.4
.5
.6
1
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
Species
setosa
0.10
0.58
0.14
0.14
0.02
0.02
0
0
0
0
0
0
0
0
0
versicolor
0
0
0
0
0
0
0.14
0.06
0.10
0.26
0.14
0.02
0.20
0.04
0.06
我正在努力按物种对观察结果进行分组,然后按物种产生相对频率。
我猜它必须是使用 group_by、变异和计数的东西,但我在网上能找到的最接近的东西是:
my_data %>%
group_by(Petal.Width,Species) %>%
summarise(n = n()) %>%
ungroup %>%
mutate(total = sum(n), rel.freq = n / total)
这仍然不是我想要的,因为它是观察的总数,而不是每个物种的数量。
非常感谢任何帮助!
您可以在 dplyr 中执行此操作,但它是 base R 中的一个衬里:
t(apply(table(iris$Species, iris$Petal.Width), 1, function(x) x/sum(x)))
#>
#> 0.1 0.2 0.3 0.4 0.5 0.6 1 1.1 1.2 1.3 1.4 1.5 1.6
#> setosa 0.1 0.58 0.14 0.14 0.02 0.02 0.00 0.00 0.0 0.00 0.00 0.00 0.00
#> versicolor 0.0 0.00 0.00 0.00 0.00 0.00 0.14 0.06 0.1 0.26 0.14 0.20 0.06
#> virginica 0.0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.02 0.04 0.02
#>
#> 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5
#> setosa 0.00 0.00 0.0 0.00 0.00 0.00 0.00 0.00 0.00
#> versicolor 0.02 0.02 0.0 0.00 0.00 0.00 0.00 0.00 0.00
#> virginica 0.02 0.22 0.1 0.12 0.12 0.06 0.16 0.06 0.06
由 reprex package (v2.0.1)
创建于 2022-02-02
是这样的吗?
虽然不确定“宽”格式;我倾向于将其保留很长时间(省略 pivot_wider
步骤)。
library(dplyr)
library(tidyr)
iris %>%
count(Species, Petal.Width) %>%
group_by(Species) %>%
mutate(p = n/sum(n)) %>%
ungroup() %>%
select(-n) %>%
pivot_wider(names_from = "Petal.Width", values_from = "p")
结果:
Species `0.1` `0.2` `0.3` `0.4` `0.5` `0.6` `1` `1.1` `1.2` `1.3` `1.4` `1.5` `1.6` `1.7` `1.8` `1.9` `2` `2.1` `2.2` `2.3` `2.4` `2.5`
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 setosa 0.1 0.58 0.14 0.14 0.02 0.02 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 versicolor NA NA NA NA NA NA 0.14 0.06 0.1 0.26 0.14 0.2 0.06 0.02 0.02 NA NA NA NA NA NA NA
3 virginica NA NA NA NA NA NA NA NA NA NA 0.02 0.04 0.02 0.02 0.22 0.1 0.12 0.12 0.06 0.16 0.06 0.06
我正在使用 iris
数据集来学习如何使用 dplyr
,并且正在尝试创建一个相对频率 table,如下所示:
Petal.Width | .1 | .2 | .3 | .4 | .5 | .6 | 1 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Species | |||||||||||||||
setosa | 0.10 | 0.58 | 0.14 | 0.14 | 0.02 | 0.02 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
versicolor | 0 | 0 | 0 | 0 | 0 | 0 | 0.14 | 0.06 | 0.10 | 0.26 | 0.14 | 0.02 | 0.20 | 0.04 | 0.06 |
我正在努力按物种对观察结果进行分组,然后按物种产生相对频率。
我猜它必须是使用 group_by、变异和计数的东西,但我在网上能找到的最接近的东西是:
my_data %>%
group_by(Petal.Width,Species) %>%
summarise(n = n()) %>%
ungroup %>%
mutate(total = sum(n), rel.freq = n / total)
这仍然不是我想要的,因为它是观察的总数,而不是每个物种的数量。
非常感谢任何帮助!
您可以在 dplyr 中执行此操作,但它是 base R 中的一个衬里:
t(apply(table(iris$Species, iris$Petal.Width), 1, function(x) x/sum(x)))
#>
#> 0.1 0.2 0.3 0.4 0.5 0.6 1 1.1 1.2 1.3 1.4 1.5 1.6
#> setosa 0.1 0.58 0.14 0.14 0.02 0.02 0.00 0.00 0.0 0.00 0.00 0.00 0.00
#> versicolor 0.0 0.00 0.00 0.00 0.00 0.00 0.14 0.06 0.1 0.26 0.14 0.20 0.06
#> virginica 0.0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.02 0.04 0.02
#>
#> 1.7 1.8 1.9 2 2.1 2.2 2.3 2.4 2.5
#> setosa 0.00 0.00 0.0 0.00 0.00 0.00 0.00 0.00 0.00
#> versicolor 0.02 0.02 0.0 0.00 0.00 0.00 0.00 0.00 0.00
#> virginica 0.02 0.22 0.1 0.12 0.12 0.06 0.16 0.06 0.06
由 reprex package (v2.0.1)
创建于 2022-02-02是这样的吗?
虽然不确定“宽”格式;我倾向于将其保留很长时间(省略 pivot_wider
步骤)。
library(dplyr)
library(tidyr)
iris %>%
count(Species, Petal.Width) %>%
group_by(Species) %>%
mutate(p = n/sum(n)) %>%
ungroup() %>%
select(-n) %>%
pivot_wider(names_from = "Petal.Width", values_from = "p")
结果:
Species `0.1` `0.2` `0.3` `0.4` `0.5` `0.6` `1` `1.1` `1.2` `1.3` `1.4` `1.5` `1.6` `1.7` `1.8` `1.9` `2` `2.1` `2.2` `2.3` `2.4` `2.5`
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 setosa 0.1 0.58 0.14 0.14 0.02 0.02 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
2 versicolor NA NA NA NA NA NA 0.14 0.06 0.1 0.26 0.14 0.2 0.06 0.02 0.02 NA NA NA NA NA NA NA
3 virginica NA NA NA NA NA NA NA NA NA NA 0.02 0.04 0.02 0.02 0.22 0.1 0.12 0.12 0.06 0.16 0.06 0.06