我一直在考慮這一點,並且無法提出解決方案。我在列X中有數據用於在列Z中創建數據。我希望Z全部爲1,直到X中有一行中有兩個0,然後是全零。另外,在W列中,我希望從底部向上看Y時最終的元素爲1,Y包含連續的兩個0。希望這是有道理的。我已經把Z欄和W欄放在了他們最終應該看的地方。我正在嘗試使用索引,但我很難弄清楚如何引用來自列X後面的行的Z行所在的行(因爲Z行1中的值基於值X中第2行和第3行)。這些應該是兩個獨立的功能,一個是看開始,一個是看結尾。它們都將分別應用到每一行,因此第X列將生成兩列,如下所示,以及另一列,在這種情況下將全爲0。謝謝你的幫助!如何根據行上/下的行中的值創建列R
** * ** *我改變的列名從A B C d到X YŽW至避免混淆。對不起,當我輸入它時沒有想到!
** * ** * ** * *我真的希望能夠做到這一點沒有功能或循環,只使用索引。我想我可以使用一個函數來解決它,但由於它是一個大型數據集,我希望它儘可能快。
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)
}
我看看'zoo'包中的'rollapply()'。像'which(rollapply(zoo(DF $ A,width = 2,function(X)all(X == 0)))[1]'''''''''''''''''''''''''''''''''''''''' '這是0,然後是0. – 2012-02-23 20:05:05