如何使用Excel或其他软件统计连续数字的出现次数?
我是博士。 学生。 我现在正在处理关于素数的论文,但是在编程上遇到困难。 我希望有人能帮我解决这个问题。 这是一个场景:
假设我有一个主要差距列表:
1 2 2 4 2 4 2 4 6 2 6 4 2 4 6
我想知道数字2后面跟着4的实例的数量。在上面的例子中,2后面跟着4的实例的数量是四次。 我也想知道4号跟6号等几次
在上面的数据中只有15个,但是如果你有大量的数据很难算。 目前我已经有了283146个数据,如果没有程序,我很难做到这一点。
在列A中列出您的列表,并在B1和C1中分别select第一个和第二个值:
=COUNTIFS(A1:A1048575,B1,A2:A1048576,C1)
请注意,几乎所有其他数组处理函数,这种尺寸的引用范围根本不是一个好主意。 然而,COUNTIF(S)/ SUMIF(S)采用对任何通过范围的隐式使用范围进行检测,因此仅对这些单元进行操作,因此在引用任意大的范围时性能几乎没有损失。
问候
@XOR LX答案是完美的,正如@Jeeped所说,它可以很好地使用偏移范围。 但是,您必须在列B:C中手动定义值列表,并且如果必须多次重复分析,并且满足条件的唯一素数的范围永远不会相同,那么可能会有些乏味。 如果你想在不到30秒的时间内达到自动结果。 对于100万行,你可以尝试下面的VBA代码。
唯一的假设是数据在列A中。如果不是这种情况,最好的select是将列中的数据复制到新表中的A列。 有了这个数据结构,你不应该有问题。
码:
Option Explicit Sub countPrimes() Dim LRC As Long, LRPrimes As Long, count As Integer, lRowB As Long, Rng As Range Application.ScreenUpdating = False LRC = 0 Range("A1").Activate While Not ActiveCell = "" If ActiveCell.Value = ActiveCell.Offset(1).Value - 2 Then LRC = LRC + 1 Range("B" & LRC).Value = ActiveCell.Value End If ActiveCell.Offset(1, 0).Activate Wend Range("B1", Range("B1").End(xlDown)).Copy Destination:=Range("C1") Range("C1", Range("C1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlNo Range("C1", Range("C1").End(xlDown)).Sort key1:=Range("C1"), order1:=xlAscending, Header:=xlNo lRowB = Range("B" & Rows.count).End(xlUp).Row Set Rng = Range("B1:B" & lRowB) Range("C1").Activate While Not ActiveCell = "" count = Application.WorksheetFunction.CountIf(Rng, ActiveCell.Value) ActiveCell.Offset(0, 1).Value = count ActiveCell.Offset(1, 0).Activate Wend Range("B1", Range("B1").End(xlDown)).Delete Application.ScreenUpdating = True End Sub
怎么运行的?
它遍历列A,并将列(x)中的每个单元格与其下面的单元格(y)进行比较。 If x = y -2
,那么它将x的值复制到B列中的第一个空行。遍历整个列后,它会在列C中生成一个唯一素数列表,ASC是有序的。 在这个新的列中,还有另一个迭代,但是这次它计算C列中每个值出现在列B中的时间,并将该值放入列D中.B列被删除,因为它不再有用。 结果:
- 专栏A:您的原始数据
- B列:独特的素数列表
- C列:计数
如何在Excel中实现?
如果你从来没有使用macros, 这个官方网站可以帮助你做到这一点。