捕捉内部切片" R中的字符向量

时间:2018-06-02 21:14:53

标签: r

我有一个字符向量,如下所示:

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 = ":")
}

3 个答案:

答案 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"