2015-03-29 4 views
3

у меня возникают проблемы манипулирования векторов в R. У меня есть вектор, который выглядит следующим образом:изменение значений в векторе данные местоположений и состояние с R

stack <- append(append(rep(0,8),c(1,0,0,0,0,1)),rep(0,6)) 
[1] 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 

моя общая цель состоит в манипулируют вектор как например:

*, когда есть 1, сделать следующие три значения в векторе 1. * изменить первоначальный 1 до 0.

так в конечном счете, вектор будет выглядеть следующим образом:

[1] 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 

второй части я могу сделать по:

replace(stack,which(stack == 1),0) 

, но я не могу понять, как эффективно сделать первый. любая помощь будет принята с благодарностью.

+0

Что должно произойти, когда у вас есть два из них один за другим в исходном списке? – daroczig

+0

, что не происходит в моем более длинном векторе, но для этого вопроса, я думаю, перезаписывать ... спасибо! очень круто – itjcms18

ответ

5

Вы можете использовать filter здесь:

c(filter(sx,c(0,0,0,0,1,1,1),circular=TRUE)) 
## [1] 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 
+0

Я получаю ошибки с этим. не применимый метод для «filter_», применяемый к объекту класса «c» («double», «numeric») « – itjcms18

+2

@ bmk759 - выглядит так, что dplyr вмешивается в базу R'? stats :: filter'. – thelatemail

+0

Хороший улов и умный способ взглянуть на него – itjcms18

5

Вот возможный вариант базы R

temp <- which(stack == 1) 
stack[as.vector(mapply(`:`, temp, temp + 3))] <- c(0, rep(1, 3)) 
stack 
# [1] 0 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0 
+0

спасибо большое! это работает для моего примера. Однако я изо всех сил пытаюсь применить его к группе с помощью dplyr. Я получаю аргументы, подразумевающие различное количество строк: 9830, 13. Я попытался изменить круглую скобку и ничего не работает. дайте мне знать, если у вас есть идеи. – itjcms18

0

Я бы с регулярными выражениями

stack <- paste0(stack, collapse="") 
stack <- gsub("1.{3}", "0111", stack) 
stack <- strsplit(stack, "+") 
Смежные вопросы