【问题标题】:SPSS: Filter dataset by specific sequence occurrenceSPSS:按特定序列出现过滤数据集
【发布时间】:2017-06-24 22:27:42
【问题描述】:

背景:我有一个包含主要机构/公司的财务信息的大型数据集(>100000 个条目)。有几列包含诸如财政年度(第 1 栏)、公司名称(第 5 栏)、董事姓名(第 6 栏)、年收入(第 11 栏)等信息。理想情况下,每家公司都应该包括其财务信息从 1996 年到 2006 年进入这个数据集。但是,许多公司在一年或几年内都缺少信息,因此应将其排除在任何进一步的分析之外。

这是我的数据集的屏幕截图: BoardCharacteristics

如您所见,此快照中包含的许多公司并未提供 1996 至 2006 财年的完整信息。

目标:第一步是过滤此数据集,以便仅将提供整个时间跨度(即 1996 年至 2006 年)信息的公司纳入后续分析。由于提供的信息在理想情况下应该至少等于每家公司的 11 行(即 1996 - 2006 年),而且许多公司在每个会计年度包含多个董事的姓名,我最初的想法是指定一个过滤器,只选择特定的序列行(从 1996 年开始到 2006 年结束),并按顺序对整个数据集执行此操作,同时忽略不完整的序列(例如,A 公司 2001 年至 2006 年缺失)或介于两者之间的任何序列。然而,由于序列长度的不一致和序列组成的可变性,一个简单/刚性的过滤器会选择任何从 1996 年开始到 2006 年结束的序列是不够的。

我知道有几个并发症:

  • 并非每个完整的序列都恰好包含 11 行,因为许多公司在每个会计年度包含不止一位董事的姓名(例如 2001 会计年度的 3 位董事姓名 --> 该公司总共 13 行)
  • 公司之间的潜在序列重叠 [例如A公司提供1996年至1999年;公司 B(紧随公司 A)2000 年到 2006 年] --> 这将导致从 1996 年到 2006 年的序列包括公司 A 和 B(这是不可取的)

我已经尝试了几个功能,包括按范围过滤功能:

RANGE(exp,low,high) --> RANGE(year,1996,2006)

正如预期的那样,这不起作用。我也尝试在 Excel 中过滤此数据集,但无济于事。

虽然我怀疑是否有一个函数可以解决这个问题,但我仍然没有找到任何有用的语法来解决这个问题。因此,我将不胜感激一些意见。如果我的问题陈述有任何不清楚的地方,请随时提问。

【问题讨论】:

    标签: excel filter statistics sequence spss


    【解决方案1】:

    这里需要使用AGGREGATE。这是一个让你摆脱困境的例子:

    DATA LIST FREE / Company Year.
    BEGIN DATA
    1, 1995
    1, 1996
    1, 1997
    1, 1998
    1, 1999
    1, 2000
    1, 2001 
    1, 2002
    1, 2002
    1, 2002
    1, 2003
    1, 2004 
    1, 2005 
    1, 2006
    2, 1996
    2, 1997
    2, 2005 
    2, 2006
    END DATA.
    DATASET NAME DS0.
    
    /* Filter data to retain only years of interest*/.
    SELECT IF RANGE(Year, 1996,2006).
    
    /* Aggregate to remove multiple year entries */.
    DATASET DECLARE DSBREAK01.
    AGGREGATE OUTFILE=DSBREAK01 /BREAK=Company Year /Count1=N.
    
    /* Aggregate to find first and last year present in data and a count of number of other distinct years in-between*/.
    DATASET ACTIVATE DSBREAK01.
    DATASET DECLARE DSBREAK02.
    AGGREGATE OUTFILE=DSBREAK02 /BREAK=Company /Count2=N /FirstYear=MIN(Year) / LastYear=MAX(Year).
    DATASET ACTIVATE DSBREAK02.
    
    /* Compute flag for companies which match desired conditions*/.
    COMPUTE Flag=(Count2=11 AND FirstYear=1996 AND LastYear=2006).
    
    /* Match flag variable to original dataset for further processing*/.
    DATASET ACTIVATE DS0.
    MATCH FILES FILE=* /TABLE=DSBREAK02 /BY Company.
    ADD FILES FILE=* /DROP=Count2 FirstYear LastYear.
    

    【讨论】:

    • 过滤第一个聚合文件(DSBREAK01)而不是原始数据文件可能更好? .... 无论如何,在过滤 1996-2006 并按年份聚合之后,如果 count2=11 比较 firstyear=1996 和 lastyear=2006 似乎是多余的,不是吗?
    • @JigneshSutar - 首先,非常感谢您的快速回答!我稍微修改了你的代码,它就像一个魅力。我只需要稍微移动列,因为在尝试合并回原始数据集时遇到 Error 5130。我忽略的一个问题是,许多公司(虽然是完整的)包含在稍微不同的名称下(例如 Adob​​e Systems / Adob​​e Systems Inc.),但不幸的是它们被排除在外。但是,使用公司代码解决了这个问题。进一步的处理也奏效了,所以我很高兴:)
    • @eli-k - 我也尝试了你的方法。它也有效,所以也感谢您的快速回复!
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 2022-08-19
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2018-06-28
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多