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

时间:2016-07-05 16:39:03

标签: r dplyr tidyr

我的数据如下:

react

如何解除聚合或反向汇总计数/频率并将数据集扩展回原来的非计数观察状态?

例如,我希望data("Titanic") df <- as.data.frame(Titanic) 在数据框中重复35次,3rd, Male, Child, No重复140次,等等。

提前致谢。

4 个答案:

答案 0 :(得分:5)

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

df2 <- df[rep(1:nrow(df), df[,5]),-5]

答案 1 :(得分:4)

您可以使用列表列和几个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为该伪向量中的每个元素创建一行。之后,我将最后两列放在类别,性别,年龄和生存率的重要类别中。

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

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

答案 2 :(得分:3)

您可以使用重塑中的untable功能执行此操作。

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

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

答案 3 :(得分:1)

使用另一种 25832 方法,使用 tidyr

tidyr::uncount