2017-05-29 78 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