我正在尝试根据我的数据构建一个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])
)
}
答案 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()
进行所有操作以返回简单的向量。
答案 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