在R中对数据集进行反汇总/逆摘要/扩展

10

我的数据是这样的:

data("Titanic")
df <- as.data.frame(Titanic)

我该如何取消聚合或反向汇总计数/频率并将数据集扩展回其原始的非计数观察状态?

例如,我希望在数据框中重复3rd, Male, Child, No 35次和1st, Female, Adult, Yes 140次,等等。

提前感谢。

4个回答

7
您可以使用列表列和一些 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会为该虚拟向量中的每个元素创建一行。之后,我删除那最后2列,只保留重要的类别(class)、性别(sex)、年龄(age)和生存情况(survival)。

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行组成的数据框。

5
没有包,我们可以根据给定的频率重复每一行:
df2 <- df[rep(1:nrow(df), df[,5]),-5]

4
您可以使用reshape中的untable函数来实现此操作。
data("Titanic")
df <- as.data.frame(Titanic)

library(reshape)
newDf = untable(df[,1:4], num = df[,5])

3
插入另一种使用 `tidyr::uncount` 的 `tidyr` 方法。
library(tidyverse)

original <- tibble(x = c(1,1,1,2,2,2,4,4,4))
aggregated <- original %>% count(x)
deaggregated <- aggregated %>% uncount(weights = n)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接