找到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帧中最长的连拍,效果非常好!