直方图的范围

时间:2018-11-07 21:21:31

标签: r histogram frequency

我正在尝试根据我的数据构建一个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 :(得分:2)

这是增加年限的一种方法。

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

答案 1 :(得分:2)

勾选@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