Диапазон до гистограммы - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь построить histogram из моих данных. Это выглядит так: data frame где в каждой строке диапазон данных. Мне нужно получить гистограмму всех значений в моем df.

year <- c("1925:2002",
          "2008",
          "1925:2002",
          "1925:2002",
          "1925:2002",
          "2008:2013",
          "1934",
          "1972:1988")

Все, что мне удалось выяснить, - это преобразовать каждую строку в последовательность с seq(), но она не работает должным образом

for (i in 1:length(year)) {
  rr[i] <- seq(
    as.numeric(unlist(strsplit(year[i], ":"))[1]),
    as.numeric(unlist(strsplit(year[i], ":"))[2])
  )
}

Вот пример base histogram

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Отметьте поле ответа для @MrFlick. Я сделал это одновременно, и единственное отличие - это трубопровод:

library(magrittr)

strsplit(year, ":") %>% 
  lapply(as.integer) %>% 
  lapply(function(x) seq(x[1], x[length(x)])) %>% 
  unlist() %>% 
  hist()

Полный tidyverse:

library(tidyverse)

str_split(year, ":") %>%
  map(as.integer) %>% 
  map(~seq(.x[1], .x[length(.x)])) %>% 
  flatten_int() %>% 
  hist()

Чтобы защитить мои комментарии, следовательно, любые tidyverse 4eva люди присоединяются к драке:

library(tidyverse)
library(microbenchmark)

microbenchmark(
  base = as.integer(
    unlist(
      lapply(
        lapply(
          strsplit(year, ":"),
          as.integer
        ),
        function(x) seq(x[1], x[length(x)])
      ),
      use.names = FALSE
    )
  ),
  tidy = str_split(year, ":") %>%
    map(as.integer) %>% 
    map(~seq(.x[1], .x[length(.x)])) %>% 
    flatten_int()
)
## Unit: microseconds
##  expr     min      lq     mean   median       uq      max neval
##  base  89.099  96.699 132.1684 102.5895 110.7165 2895.428   100
##  tidy 631.817 647.812 672.5904 667.8250 686.2740  909.531   100
0 голосов
/ 08 ноября 2018

Это один из способов разделить ваши годы.

years <- unlist(lapply(strsplit(year, ":"), function(x) {
  x <- as.numeric(x)
  if (length(x)==2) {
    return(seq(x[1], x[2]))
  } else {
    return(x)
  }
}))
hist(years)

Сначала мы выполняем разбиение, затем либо расширяем его как последовательность, либо возвращаем числовое значение, и, наконец, unlist() все, чтобы получить простой вектор.

enter image description here

...