首页 > 解决方案 > 仅使用“if”折叠数据集的子集

问题描述

我试图collapse只使用我的数据的一个子集if,但它的下降/崩溃似乎比我预期的要多得多。

对于我使用了if限定符的所有其他命令,该命令仅适用于符合if条件的数据子集,而保留其余数据

例如,replace不改变以下数据foreign != 1

. sysuse auto, clear
(1978 Automobile Data)

. replace mpg = 16 if foreign == 1
(22 real changes made)

但是,它似乎collapse适用于符合if标准的数据并丢弃其余数据:

. count if mpg > -1
  74

. * all the data has mpg > -1

. count if foreign == 1
  22

. collapse (mean) mpg if foreign == 1

. count if mpg > -1
  1

理论上没有理由collapse不能以与replace. 它可以保留所有foreign != 1内容,同时将所有数据折叠foreign == 1到一个观察值。

这实际上就是我想要对我的数据做的事情,那么我应该做些什么不同的事情呢?

@NickCox 很有帮助地提出了这样的建议:

. save "temp/whatever"
file temp/whatever.dta saved

. sysuse auto, clear
(1978 Automobile Data)

. drop if foreign == 1
(22 observations deleted)

. append using "temp/whatever"
(note: variable mpg was int, now float to accommodate using data's values)

这适用于这个沙盒,但我的数据集有 1000 万个观察值。如果我可以避免重新加载它,我可以为自己节省半个小时。如果我必须为多种情况执行此操作,则更多。

任何其他建议将不胜感激。

标签: stata

解决方案


collapseif这种方式工作:

if由条件选择的那些观察是collapsed,通常(但不一定)到具有较少观察的新数据集中。

那些没有被选中的观察消失了。

在这方面说这个命令是不寻常的,更不用说独特了,这是不正确的。contract并且keep也以这种方式工作:未选择的任何内容都会消失。(社区经常要求save使用if: savesomefrom SSC 是一种解决方法。)

如果您想要collapse一些观察但保持其他观察不变,那么您可以尝试

A. 这个策略

A1。use你的数据集

A2。keep if你想要不变的东西和save那些观察

A3。use你的数据集再次

A4。collapse去尝尝

A5。append来自 A2 的数据集

sysuse auto, clear
keep if !foreign 
save domestic 
sysuse auto, clear
collapse mpg if foreign 
gen make = "All foreign" 
append using domestic 

或 B. 这个:

B1。使用(如果需要创建)一个标识符,该标识符对于您想要不变的观察是唯一的(不同的),但对于您想要的观察采用单个值collapsed

B2。collapse将该标识符提供给by().

sysuse auto, clear 
replace make = "All foreign" if foreign 
collapse mpg, by(make) 

虽然 B 在这个例子中看起来微不足道,但对我来说,它对于大型数据集总是优越的,并且如果你想继续处理许多变量,这远非显而易见。我没有尝试过对大型数据集甚至任何数据集进行时间或内存比较,因为我以前没有遇到过这个愿望。


推荐阅读