找到data.frame中某事物连续出现的最大计数的好方法是什么?

找到data.frame中某事物连续出现的最大计数的好方法是什么?,r,dplyr,R,Dplyr,例如,假设有一个data.frame: set.seed(1) x = data.frame(foo=letters, bar=as.integer((rnorm(26) > 0.5))) 在本例中,1的最大连续条纹出现在第18行和第22行之间(包括第18行和第22行)。我想知道的是,如果有一个更大的框架,有没有一个好的方法来识别这样一个点?我通常使用表格和dplyr,并尝试使用特殊值cumprod或cumsum,但这两种方法似乎都无法解决问题。我们可以使用rle获得向量(或列)中相同的

例如,假设有一个
data.frame

set.seed(1)
x = data.frame(foo=letters, bar=as.integer((rnorm(26) > 0.5)))

在本例中,
1
的最大连续条纹出现在第18行和第22行之间(包括第18行和第22行)。我想知道的是,如果有一个更大的框架,有没有一个好的方法来识别这样一个点?我通常使用表格和
dplyr
,并尝试使用特殊值
cumprod
cumsum
,但这两种方法似乎都无法解决问题。

我们可以使用
rle
获得
向量(或列)中相同的相邻元素的长度和值。获取“长度”的逻辑索引,该索引等于1的“值”的最大长度。求反并将这些“值”赋给0。使用
inverse.rle
我们得到原始长度的
向量。要查找非0的元素,请使用
which
并使用
sum
获取计数

 v1 <- inverse.rle(within.list(rle(x$bar), 
   values[!(lengths==max(lengths[values==1]) & values!=0)] <- 0))
 which(v1!=0)
 #[1] 18 19 20 21 22
 sum(v1)
 #[1] 5

v1我们可以使用
rle
获得
向量(或列)中相同的相邻元素的长度和值。获取“长度”的逻辑索引,该索引等于1的“值”的最大长度。求反并将这些“值”赋给0。使用
inverse.rle
我们得到原始长度的
向量。要查找非0的元素,请使用
which
并使用
sum
获取计数

 v1 <- inverse.rle(within.list(rle(x$bar), 
   values[!(lengths==max(lengths[values==1]) & values!=0)] <- 0))
 which(v1!=0)
 #[1] 18 19 20 21 22
 sum(v1)
 #[1] 5
v1还有另一种方法:

with(rle(x$bar), {
  w = which.max(lengths*(values==1))
  cumsum(c(1L,lengths))[w+0:1] - 0:1
})
# 18 22
工作原理:

我们希望运行的
值==1
是最长的。由于真/假映射到R中乘法下的1/0,因此这是最大化
长度*(值==1)
的运行。称之为第次运行

cumsum(c(1L,长度))
包含每次运行的起始位置,以及
1L+长度(x$bar)
处的额外元素。如果我们选择
w
th元素,我们就有了跑步的起始位置。如果我们选择
w+1
th元素并从中减去一,我们就得到了运行的结束位置。

还有另一种方法:

with(rle(x$bar), {
  w = which.max(lengths*(values==1))
  cumsum(c(1L,lengths))[w+0:1] - 0:1
})
# 18 22
工作原理:

我们希望运行的
值==1
是最长的。由于真/假映射到R中乘法下的1/0,因此这是最大化
长度*(值==1)
的运行。称之为第次运行


cumsum(c(1L,长度))
包含每次运行的起始位置,以及
1L+长度(x$bar)
处的额外元素。如果我们选择
w
th元素,我们就有了跑步的起始位置。如果我们选择
w+1
th元素并从中减去一,我们就得到了运行的结束位置。

预期输出是什么?您想找到最大条纹还是行号?@akrun两者都有,虽然知道行号,但获得最大条纹并不重要。预期的输出是什么?你想找到最大条纹还是行号?@akrun两者都有,虽然知道行号,但获得最大条纹很简单。Frank是对的,我的向量正在运行(长度接近200000)@Frank我需要保留
值吗=0
@akrun-Hm,不,我想不是。通过删除它,您将把那些值==0的位置添加到分配值为零的位置集(因此,没有更改)。(这是假设向量可靠地只有零和一开始。)Frank是对的,我的向量正在运行(长度接近200000)@Frank我需要保留
值吗=0
@akrun-Hm,不,我想不是。通过删除它,您将把那些值==0的位置添加到分配值为零的位置集(因此,没有更改)。(这是假设向量可靠地只有零和一开始。)谢谢,我在我的48帧中找到了最长的条纹,效果非常好!谢谢,我发现我的48帧中最长的连拍,效果非常好!