Я долго думал об этом и не могу найти решение.У меня есть данные в столбце X, которые я хочу использовать для создания данных в столбце Z. Я хочу, чтобы Z равнялся всем 1 до точки, где в X есть два 0 в строке, а затем все нули после этого.Кроме того, в столбце W я хочу, чтобы конечные элементы были единицами, если смотреть на Y снизу вверх, Y содержит два ноля подряд.Надеюсь, что это имеет смысл.Я указал в колонке Z и колонке W, как они должны выглядеть в итоге.Я пытаюсь использовать индексирование, но мне трудно понять, как ссылаться на строки из столбца X, которые идут после строки, где будет значение для Z (потому что значение в строке 1 Z основано на значенияхстрок 2 и 3 в X).Это должны быть две отдельные функции: одна для просмотра в начале и одна для просмотра в конце.Они оба будут применены к каждой строке отдельно, поэтому столбец X будет содержать два столбца, Z, как показано ниже, а также другой столбец, который в этом случае будет иметь все 0.Спасибо за любую помощь!
****** Я изменил имена столбцов с ABCD на XYZWчтобы избежать путаницы.Извините, не думал об этом, когда я набрал его!
********** Мне бы очень хотелось сделать это без функций или циклов, просто используя индексацию.Я думаю, что я мог бы понять это с помощью функции, но так как это большой набор данных, я хочу, чтобы он был максимально быстрым.
code X Y Z W
A 1 0 1 0
A 1 0 1 0
A 0 0 1 0
A 1 0 1 0
A 1 0 1 0
A 1 0 1 0
A 1 0 1 0
A 0 0 1 0
A 1 0 1 0
A 0 0 0 0
A 0 0 0 0
A 1 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
A 0 0 0 0
B 0 0 0 0
B 0 0 0 0
B 0 0 0 0
B 0 0 0 0
B 1 1 0 0
B 0 0 0 0
B 1 0 0 0
B 0 0 0 0
B 1 0 0 0
B 0 0 0 0
B 0 0 0 0
B 1 0 0 0
B 0 1 0 0
B 0 0 0 0
B 0 0 0 0
B 0 1 0 1
B 0 1 0 1
B 0 1 0 1
B 0 0 0 1
B 0 1 0 1
B 0 1 0 1
Следующая функция, используемая с агрегатом, должна дать результаты, которые янаходясь в поиске.Спасибо Тайлеру за начало работы.Я все еще чувствую, что должен быть более простой способ сделать это, но сейчас это должно сделать.Спасибо всем за ваш вклад!
Думаю, я понял это, основываясь на коде Тайлера, всего лишь с несколькими изменениями.Я просто применю эту функцию, используя агрегат, и все должно получиться.Спасибо за все вклады!
pat.finder <- function(var, value=0, fill1=1, fill2=0, rev=FALSE, seq=2){
if(var[1]==0 & rev==FALSE){
j<- rep(0,length(var))} else if(var[length(var)]==0 & rev == TRUE){
j<- rep(0,length(var))} else{
x <- if(rev) rle(rev(var)) else rle(var)
n <- which(x[[1]]>(seq-1) & x[[2]]==value)[1]-1
i <- sum(x[[1]][1:n])
j <- if(rev){
rev(c(rep(fill1, i), rep(fill2, length(var)-i)))
} else {
c(rep(fill1, i), rep(fill2, length(var)-i))
}
}
return(j)
}