我有一个字符向量,如下所示:
test <- c(1, 7, 13, 19, 25, 31, 37)
我想在中间返回数字,如下:
"2:6" "8:12" "14:18" "20:24" "26:30" "32:36"
我成功地做到了,但它并不像我希望的那样强大:
rangefunc <- function(x){
paste(x+1, x+5, sep = ":")
}
head(sapply(test, rangefunc))
显然,这是一个可行的解决方案,但对于数字之间的分离在整个过程中不均匀(例如,始终为6)或分离不同的情况,它不具备前瞻性(即,不是6)。为了处理我的角色向量test
中的这种潜在案例,我如何构建一个比以下更强大的函数:
rangefunc <- function(x){
paste(x+1, x+5, sep = ":")
}
答案 0 :(得分:3)
paste(head(test, -1) + 1, tail(test, -1) - 1, sep = ':')
# [1] "2:6" "8:12" "14:18" "20:24" "26:30" "32:36"
看起来这个输出可能不是很有用(取决于你想要它的原因)。你可能想要这样的东西
data.frame(start = head(test, -1) + 1
, end = tail(test, -1) - 1)
# start end
# 1 2 6
# 2 8 12
# 3 14 18
# 4 20 24
# 5 26 30
# 6 32 36
答案 1 :(得分:1)
使用zoo::rollapply
的选项:
test <- c(1, 7, 13, 19, 25, 31, 37)
library(zoo)
rollapply(test, 2, function(x)paste(x[1]+1,x[2]-1, sep=":"))
#[1] "2:6" "8:12" "14:18" "20:24" "26:30" "32:36
答案 2 :(得分:0)
你可以这样做:
sapply(seq_along(test[-1]),function(i) paste0(test[i]+1,":",test[i+1]-1))
# [1] "2:6" "8:12" "14:18" "20:24" "26:30" "32:36"