Excel:如何使用不同的列长度更新公式

时间:2017-12-01 16:22:32

标签: excel csv

首先,如果之前有人问过,请道歉。我很难找到先前被问过的问题,所以在这里:

我有计算来自.csv的传入数据的公式。问题是公式只计算原始csv及其行数的长度。 csv的进入行数差别很大。有没有一种简单的方法来解决这个问题?

谢谢, Ĵ

2 个答案:

答案 0 :(得分:1)

您可以使用INDEX / MATCH:

import numpy as np
cimport numpy as np
cimport cython
from cython.view cimport array as cvarray
from libc.stdlib cimport malloc, free
from libc.math cimport log, exp
from cython_gsl cimport *
import ctypes
from libc.string cimport memset

cdef extern from "stdlib.h":         
    long rand()                    
    void srand(int seed)                    

cdef extern from "time.h":
    ctypedef long time_t
    time_t time(time_t*)

cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)
srand(time(NULL))
@cython.cdivision(True)     
@cython.boundscheck(False)
@cython.wraparound(False)     
cdef void initPar( double* alpha, int* K, int* N, gsl_matrix* mu, gsl_matrix *Z ):
     cdef:
          int i, j
          int seed = rand()
     #generate random seed
     gsl_rng_set(r, seed)
     cdef double prev_mu
     for i from 0 <= i < K[0]:
         if i >= 1:
            prev_mu *= gsl_ran_beta(r, alpha[0], 1)                
         else:
            prev_mu = gsl_ran_beta(r, alpha[0], 1)

         gsl_matrix_set(mu, i, 0, prev_mu)        

     cdef double mi
     for i from 0 <= i < K[0]:
         mi= gsl_matrix_get(mu, i, 0)
         for j from 0 <= j < N[0]: 
             gsl_matrix_set(Z, j, i, gsl_ran_bernoulli(r, mi) )

     return

def func(np.ndarray[ndim=2, dtype=np.float64_t] inputs, int LFeatures = 5, double alpha):
    cdef:
        int *K_init= &LFeatures
        int N    = inputs.shape[0]
        int D    = inputs.shape[1]
        gsl_matrix *mu = gsl_matrix_alloc(K_init[0], 1)
        gsl_matrix *Z  = gsl_matrix_alloc(N, K_init[0])
        int i, j
        gsl_matrix *X    = gsl_matrix_alloc(N, D)
    for i from 0 <= i < N:
         for j from 0 <= j < D:
             gsl_matrix_set(X, i, j, inputs[i,j])

    gsl_matrix_set_zero(mu)
    gsl_matrix_set_zero(Z)
    initPar(&alpha, K_init, &N, mu, Z )

这将把从B2开始的所有单元格汇总到最后一个单元格中的数字。

=SUM(B2:INDEX(B:B,MATCH(1E+99,B:B,0)))

这将连接从B2到最后一个单元格中包含文本的所有单元格。

要查找最后一个单元格,无论是数字还是文本:

=CONCAT(B2:INDEX(B:B,MATCH("zzz",B:B,0)))

一个注意事项,大多数标准公式对完整列引用没有任何损害,如COUNTIF(S),SUMIF(S),...

数组公式和类似公式的数组(SUMPRODUCT,AGGREGATE)需要限制对数据集的引用,并且使用上述方法将允许动态使用数据集。

编辑:

你的频率公式:

INDEX(B:B,MAX(IFERROR(MATCH("zzz",B:B,0),0),IFERROR(MATCH(1E+99,B:B,0),0)))

答案 1 :(得分:0)

您可以将所有公式更改为&#34; D:D&#34;为了计算整行。例如:&#34; = countif(D:D,&#34; *&#34;)&#34;将计算D列中的所有内容,您也可以使用类似的函数进行其他数学运算。

您还可以使用VBA动态计算行数,然后在公式中使用该数字,但这是一个完整的其他主题/对话/问题。