我正在尝试仅使用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
的数据保留完整,而将所有. 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)
的数据折叠为一个观测值。
这实际上是我想要处理的数据,那么我应该做些什么?
@NickCox提出了类似的建议:
jdbc:oracle:thin:192.168.1.5:1521:DCGCDB
在此沙箱中有效,但我的数据集有1000万个观测值。如果可以避免重新加载,则可以节省半小时。如果必须针对多种情况执行此操作,则更多。
还有其他建议。
答案 0 :(得分:2)
collapse
和if
的工作方式如下:
通过if
条件选择的那些观测值通常(但不一定)被collapse
d放入具有较少观测值的新数据集中。
那些未选择的观察消失。
在这方面说此命令是不寻常的,更不用说唯一了,这是不正确的。 contract
和keep
也以这种方式工作:未选择的内容消失了。
(社区经常要求将save
与if
一起使用:savesome
是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。使用(如果需要,创建)一个标识符,该标识符对于您想要保持不变的观测值是唯一的(不同),但是对于您想要的观测值collapse
d
B2。 collapse
将该标识符提供给by()
。
sysuse auto, clear
replace make = "All foreign" if foreign
collapse mpg, by(make)
尽管在这个示例中B看起来很琐碎,但对我来说,它远非显而易见,对于大型数据集,如果您想继续使用许多变量,它总是优越的。我没有针对大型数据集甚至任何数据集进行时序或内存比较的实验,因为我以前从未遇到过这个愿望。