如何使用Excel或其他软件计算连续数字的出现次数?

时间:2015-11-06 08:09:27

标签: excel count primes

我是博士。学生。我正在处理关于素数的论文,但我在编程方面遇到了困难。我希望有人可以帮助我解决这个问题。这是场景:

假设我有一个主要差距列表:

1
2
2
4
2
4
2
4
6
2
6
4
2
4
6

我想知道数字2后跟4的实例数。在上面的例子中,2跟随4的实例数是4。我还想知道4号跟随6号等的次数

在上面的数据中,只有15个,但如果您拥有大量数据,则难以计算。目前我已有283,146个数据,如果我没有程序,我很难做到这一点。

2 个答案:

答案 0 :(得分:2)

将列表放在A列中,分别选择B1和C1中的第一个和第二个值:

=COUNTIFS(A1:A1048575,B1,A2:A1048576,C1)

请注意,对于几乎所有其他阵列处理功能,引用这些大小的范围根本不是一个好主意。但是,COUNTIF(S)/ SUMIF(S)从任何通过的范围中隐式检测使用范围,因此仅对这些单元进行操作,因此在引用任意大范围时,性能几乎没有或没有损失。

此致

答案 1 :(得分:1)

@XOR LX答案是完美的,正如@Jeeped所说,它可以最佳地使用偏移范围。但是,您必须在B:C列中手动定义值列表,如果必须多次重复分析,并且满足条件的唯一素数范围从不相同,则可能有点单调乏味。如果您想在不到30秒的时间内获得自动结果。对于100万行,您可以尝试以下VBA代码。

唯一的假设是数据在A列中。如果不是这种情况,最好的选择是将包含数据的列复制到新工作表中的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中实现?

如果您从未使用过宏,this official website可以帮助您完成此操作。