2017-05-29 68 views
0

在R中,我有一个大型数据框的列表,其中包含两列,分别为valuecount。我在前面的步骤中使用的函数返回value中的观察值,相应的列count显示了观察到该特定值的次数。以下代码生成一个数据帧为例 - 但是列表中的所有数据帧都具有不同的值,值范围:汇总来自值和计数属性的数据

d <- as.data.frame(
    cbind(
    value = runif(n = 1856, min = 921, max = 4187), 
    count = runif(n = 1856, min = 0, max = 20000) 
) 
) 

现在我想汇总数据以便能够创建可查看的可视化。此聚合应该应用于列表中的所有数据帧,每个数据帧具有不同的值范围。我正在寻找一种功能,将数据切割成新的值和计数,有点像直方图函数。因此,例如,对于所有数值为0到100的数值,计数应该加总(等等,在定义的时间间隔内,干净的间隔边界起点像0)。

我的第一个尝试是创建一个简单的值向量,其中每个值都重复了多次,由count字段确定。然后,下一步将应用hist()函数而不绘制以获得可以在hist()的论点中定义的聚合值和计数。但是,这会产生太大的向量(每个有一些Gb),R无法再处理。我很欣赏任何解决方案或提示!

回答

0

我不完全确定我正确理解你的问题,但这可能会解决你的问题,或者至少将你指向一个方向。我列出数据帧,然后生成一个新列,其中包含使用purrr包中的mapbinfunction应用于每个数据帧的结果。

library(tidyverse) 

d1 <- d2 <- tibble(
    value = runif(n = 1856, min = 921, max = 4187), 
    count = runif(n = 1856, min = 0, max = 20000) 
) 

d <- tibble(name = c('d1', 'd2'), data = list(d1, d2)) 

binfunction <- function(data) { 
    data %>% mutate(bin = value - (value %% 100)) %>% 
    group_by(bin) %>% 
    mutate(sum = sum(count)) %>% 
    select(bin, sum) 
} 

d_binned <- d %>% 
    mutate(binned = map(data, binfunction)) %>% 
    select(-data) %>% 
    unnest() %>% 
    group_by(name, bin) %>% 
    slice(1L) 

d_binned 
#> Source: local data frame [66 x 3] 
#> Groups: name, bin [66] 
#> 
#> # A tibble: 66 x 3 
#>  name bin  sum 
#> <chr> <dbl> <dbl> 
#> 1 d1 900 495123.8 
#> 2 d1 1000 683108.6 
#> 3 d1 1100 546524.4 
#> 4 d1 1200 447077.5 
#> 5 d1 1300 604759.2 
#> 6 d1 1400 506225.4 
#> 7 d1 1500 499666.5 
#> 8 d1 1600 541305.9 
#> 9 d1 1700 514080.9 
#> 10 d1 1800 586892.9 
#> # ... with 56 more rows 

d_binned %>% 
    ggplot(aes(x = bin, y = sum, fill = name)) + 
    geom_col() + 
    facet_wrap(~name) 

我灵感的分级见this comment。它以100个为一组来分组数据,例如, bin 1100代表1100到< 1200等。我想你可以根据你的需要调整binfunction