我一直在考虑这一点,并且无法提出解决方案。我在列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