Захват "внутренних кусочков" символьного вектора в R - PullRequest
0 голосов
/ 03 июня 2018

У меня есть символьный вектор, вот так:

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 голосов
/ 03 июня 2018
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
0 голосов
/ 03 июня 2018

Опция, использующая 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
0 голосов
/ 03 июня 2018

Вы можете сделать это:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...