Расщепление вектора - PullRequest
4 голосов
/ 17 июня 2011

У меня есть вектор x, состоящий из "Y" и "N".

> x
 [1] Y N N N N N N N N N N Y N N N N

Я хотел бы разделить это на

> x1
 [1] Y N N N N N N N N N N 

и

> x2
 [1] Y N N N N 

Эти векторы всегда начинаются с "Y" и принимают все "N" перед следующим "Y". Предложения о том, как это сделать?

Ответы [ 3 ]

7 голосов
/ 17 июня 2011

Вы можете использовать комбинацию cumsum и split, чтобы сделать это с одной строкой:

x <- c("Y","N","N","N","N","N","N","N","N","N","N","Y","N","N","N","N")
v <- split(x,paste("x",cumsum(x=="Y"),sep=""))
3 голосов
/ 17 июня 2011

Свернуть в одну строку, а затем разбить на "Y".

x <- c("Y", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "Y", "N", "N", "N", "N")
y <- paste(x, collapse = "")
z <- paste("Y", strsplit(pn, "Y")[[1]], sep = "")[-1]
z

Или с использованием кодировки длины серии.

n <- rle(x)$lengths[c(FALSE, TRUE)]
lapply(n, function(i) paste("Y", rep.int("N", i), sep = "", collapse = ""))

(Это даст вам список, а не вектор. Используйте unlist, если это не то, что вы хотите.)

3 голосов
/ 17 июня 2011

Есть, конечно, лучшие способы, но:

tst<-c("Y", "N", "N", "N", "N", "N", "N", "N", "N", "N", "N", "Y", "N", "N", "N", "N")
starts<-which(tst=="Y") #where are the "Y"
ends<-c(starts[-1]-1, length(tst)) #pos before each "Y""
lapply(seq_along(starts), function(i){tst[(starts[i]):(ends[i])]}) #parts from each start till each end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...