Свернуть только подмножество набора данных с помощью «если» - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь 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)

Это работает в этой песочнице, но мой набор данных имеет 10 миллионов наблюдений. Если мне удастся избежать перезагрузки, я смогу сэкономить себе полчаса. Больше, если мне придется сделать это для нескольких случаев.

Будем благодарны за любые другие предложения.

1 Ответ

0 голосов
/ 19 ноября 2018

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 выглядит тривиально для этого примера, для меня далеко не очевидно, что он всегда лучше для больших наборов данных и если вы хотите продолжать работать со многими переменными.Я не экспериментировал с синхронизацией или сравнением памяти для больших наборов данных или даже для любых наборов данных, так как раньше не встречал этого желания.

...