解聚合/反向汇总/扩展 R 中的数据集
De-aggregate / reverse-summarise / expand a dataset in R
我的数据是这样的:
data("Titanic")
df <- as.data.frame(Titanic)
如何取消聚合或反向汇总 count/freq 并将数据集扩展回其原始的非计数观察状态?
例如,我希望在数据帧中 3rd, Male, Child, No
重复 35 次,1st, Female, Adult, Yes
重复 140 次等等。
提前致谢。
您可以使用 reshape 中的函数 untable
来做到这一点。
data("Titanic")
df <- as.data.frame(Titanic)
library(reshape)
newDf = untable(df[,1:4], num = df[,5])
如果没有包,我们可以根据给定的频率重复每一行:
df2 <- df[rep(1:nrow(df), df[,5]),-5]
您可以使用列表列和一些 dplyr
/tidyr
/purrr
动词来做到这一点。它不像其他基础 R 解决方案那么紧凑,但对我来说,它更容易理解事物是如何组合在一起的,并且它在更大的 tidyverse
管道流中工作。
首先检查一下,我们预计最终数据框中有 2,201 行:
library(dplyr)
library(tidyr)
library(purrr)
sum(df$Freq)
#> [1] 2201
将其转换为 tibble
可以更轻松地查看和使用列表列。我正在使用 purrr::map
沿 Freq
列移动,创建一个虚拟标记向量,长度为 Freq
值。在这种情况下,该标记只是“1”;它可以改为 TRUE
或其他任何东西。重点在于它将创建一个长度为 Freq
.
的向量
df %>%
as_tibble() %>%
mutate(obs = map(Freq, ~rep_len(1, .x)))
#> # A tibble: 32 x 6
#> Class Sex Age Survived Freq obs
#> <fct> <fct> <fct> <fct> <dbl> <list>
#> 1 1st Male Child No 0 <dbl [0]>
#> 2 2nd Male Child No 0 <dbl [0]>
#> 3 3rd Male Child No 35 <dbl [35]>
#> 4 Crew Male Child No 0 <dbl [0]>
#> 5 1st Female Child No 0 <dbl [0]>
#> 6 2nd Female Child No 0 <dbl [0]>
#> 7 3rd Female Child No 17 <dbl [17]>
#> 8 Crew Female Child No 0 <dbl [0]>
#> 9 1st Male Adult No 118 <dbl [118]>
#> 10 2nd Male Adult No 154 <dbl [154]>
#> # … with 22 more rows
然后 tidyr::unnest
为该虚拟向量中的每个元素创建一行。之后,我删除最后两列,只包含 class、性别、年龄和生存等重要类别。
df %>%
as_tibble() %>%
mutate(obs = map(Freq, ~rep_len(1, .x))) %>%
unnest() %>%
select(-Freq, -obs)
#> # A tibble: 2,201 x 4
#> Class Sex Age Survived
#> <fct> <fct> <fct> <fct>
#> 1 3rd Male Child No
#> 2 3rd Male Child No
#> 3 3rd Male Child No
#> 4 3rd Male Child No
#> 5 3rd Male Child No
#> 6 3rd Male Child No
#> 7 3rd Male Child No
#> 8 3rd Male Child No
#> 9 3rd Male Child No
#> 10 3rd Male Child No
#> # … with 2,191 more rows
最后其实是一个2201行的数据框
采用另一种 tidyr
方法,使用 tidyr::uncount
。
library(tidyverse)
original <- tibble(x = c(1,1,1,2,2,2,4,4,4))
aggregated <- original %>% count(x)
deaggregated <- aggregated %>% uncount(weights = n)
我的数据是这样的:
data("Titanic")
df <- as.data.frame(Titanic)
如何取消聚合或反向汇总 count/freq 并将数据集扩展回其原始的非计数观察状态?
例如,我希望在数据帧中 3rd, Male, Child, No
重复 35 次,1st, Female, Adult, Yes
重复 140 次等等。
提前致谢。
您可以使用 reshape 中的函数 untable
来做到这一点。
data("Titanic")
df <- as.data.frame(Titanic)
library(reshape)
newDf = untable(df[,1:4], num = df[,5])
如果没有包,我们可以根据给定的频率重复每一行:
df2 <- df[rep(1:nrow(df), df[,5]),-5]
您可以使用列表列和一些 dplyr
/tidyr
/purrr
动词来做到这一点。它不像其他基础 R 解决方案那么紧凑,但对我来说,它更容易理解事物是如何组合在一起的,并且它在更大的 tidyverse
管道流中工作。
首先检查一下,我们预计最终数据框中有 2,201 行:
library(dplyr)
library(tidyr)
library(purrr)
sum(df$Freq)
#> [1] 2201
将其转换为 tibble
可以更轻松地查看和使用列表列。我正在使用 purrr::map
沿 Freq
列移动,创建一个虚拟标记向量,长度为 Freq
值。在这种情况下,该标记只是“1”;它可以改为 TRUE
或其他任何东西。重点在于它将创建一个长度为 Freq
.
df %>%
as_tibble() %>%
mutate(obs = map(Freq, ~rep_len(1, .x)))
#> # A tibble: 32 x 6
#> Class Sex Age Survived Freq obs
#> <fct> <fct> <fct> <fct> <dbl> <list>
#> 1 1st Male Child No 0 <dbl [0]>
#> 2 2nd Male Child No 0 <dbl [0]>
#> 3 3rd Male Child No 35 <dbl [35]>
#> 4 Crew Male Child No 0 <dbl [0]>
#> 5 1st Female Child No 0 <dbl [0]>
#> 6 2nd Female Child No 0 <dbl [0]>
#> 7 3rd Female Child No 17 <dbl [17]>
#> 8 Crew Female Child No 0 <dbl [0]>
#> 9 1st Male Adult No 118 <dbl [118]>
#> 10 2nd Male Adult No 154 <dbl [154]>
#> # … with 22 more rows
然后 tidyr::unnest
为该虚拟向量中的每个元素创建一行。之后,我删除最后两列,只包含 class、性别、年龄和生存等重要类别。
df %>%
as_tibble() %>%
mutate(obs = map(Freq, ~rep_len(1, .x))) %>%
unnest() %>%
select(-Freq, -obs)
#> # A tibble: 2,201 x 4
#> Class Sex Age Survived
#> <fct> <fct> <fct> <fct>
#> 1 3rd Male Child No
#> 2 3rd Male Child No
#> 3 3rd Male Child No
#> 4 3rd Male Child No
#> 5 3rd Male Child No
#> 6 3rd Male Child No
#> 7 3rd Male Child No
#> 8 3rd Male Child No
#> 9 3rd Male Child No
#> 10 3rd Male Child No
#> # … with 2,191 more rows
最后其实是一个2201行的数据框
采用另一种 tidyr
方法,使用 tidyr::uncount
。
library(tidyverse)
original <- tibble(x = c(1,1,1,2,2,2,4,4,4))
aggregated <- original %>% count(x)
deaggregated <- aggregated %>% uncount(weights = n)