【问题标题】:Using Stata's keep command on multiple blocks of variables在多个变量块上使用 Stata 的 keep 命令
【发布时间】:2014-11-06 14:47:52
【问题描述】:

我刚开始研究一个包含 500 万个观测值和大量变量的海量数据集。为了更快地处理这个,我只想选择一些感兴趣的变量并删除其余的。

使用keep,我可以选择一个变量块,非常简单:

keep varx1-x5 

但是,我想要的变量在数据集中没有顺序:

varx1 varx2 varx3 varz1 varz2 vary1 vary2 vary3

我不想要 varz 变量的地方。我只想要带有varxvary 的块。

所以。我不太擅长循环,但我试过这个:

foreach varname of varlist varx1-varx3 vary1-vary3  {
keep `varname'
}

这不起作用,因为它keeps 只有varx1,然后尝试keep 其他人,并因为他们刚刚被dropped 而出错。

如何告诉keep 选择多个变量块?

【问题讨论】:

    标签: stata


    【解决方案1】:

    不要使用keep,它会清除未提供给命令的变量,而是尝试drop,它只会删除您指定的变量。循环不是必需的。一个例子:

    clear 
    set obs 0
    
    *----- example vars -----
    
    gen varx1 = .
    gen varx2 = .
    gen varx3 = .
    gen varz1 = .
    gen varz2 = .
    gen vary1 = .
    gen vary2 = .
    gen vary3 = .
    
    *----- what you want -----
    
    drop varz*
    

    这两个命令是共同记录的,所以 help keephelp drop 会让你到达那里。

    【讨论】:

    • 感谢您的回复。但是,对我的数据使用 drop 不是一种选择。我给出的示例是我必须处理的大量变量的一个非常简单的版本。所以丢弃的过程是非常低效的。选择/保留更有意义:)
    • 您有任何证据证明这一说法吗?无论您要的是想要的变量还是不想要的变量,数据集的结果都是一样的。为什么认为这对 Stata 很重要?
    • 抱歉,没看过你的帖子,现在我的推理从那时起就逃脱了。那时我是一个头脑发热的年轻人。
    【解决方案2】:

    如果您不知道要删除的所有变量,请仅保留带有 varxvary 的块:

    keep varx* varz*
    

    * 表示前面表达式的“匹配零个或多个”。

    【讨论】:

    • * 的所述含义在此上下文中不正确。这对正则表达式来说很好,但在这里它只是意味着,例如,所有以varx 开头的变量都带有其他任何后缀。例如:varx1varx2varxwhateverhelp varlist 的引用是“匹配一个或多个字符”。 (原贴希望keepvarx*vary*,而不是varz*。)
    • 当然。多么愚蠢,我没有想到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多