解聚合/反向汇总/扩展R中的数据集

eme*_*hex 7 r dplyr tidyr

我的数据如下:

data("Titanic")
df <- as.data.frame(Titanic)
Run Code Online (Sandbox Code Playgroud)

如何对计数/频率进行反聚合或反向汇总,并将数据集扩展回原始的非计数观察状态?

例如,我想在数据帧中3rd, Male, Child, No重复35次并1st, Female, Adult, Yes重复140次等.

提前致谢.

cam*_*lle 7

你可以用列表的列和几个做dplyr/ tidyr/purrr动词。它不像其他基本的 R 解决方案那样紧凑,但对我来说,更容易理解事物是如何组合在一起的,并且它在更大的tidyverse管道流中工作。

首先检查一下,我们预计最终数据框中有 2,201 行:

library(dplyr)
library(tidyr)
library(purrr)

sum(df$Freq)
#> [1] 2201
Run Code Online (Sandbox Code Playgroud)

将其转换为 atibble可以更轻松地查看和使用列表列。我正在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
Run Code Online (Sandbox Code Playgroud)

然后tidyr::unnest为该虚拟向量中的每个元素创建一行。在那之后,我去掉最后两列,只包含阶级、性别、年龄和生存的重要类别。

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
Run Code Online (Sandbox Code Playgroud)

最后,它实际上是一个 2,201 行的数据框。


Pie*_*une 5

没有包装,我们可以根据给定的频率重复每一行:

df2 <- df[rep(1:nrow(df), df[,5]),-5]
Run Code Online (Sandbox Code Playgroud)