Сортированная двусторонняя табуляция многих значений

У меня есть набор данных приличного размера (около 18 000 строк). У меня есть две переменные, которые я хочу свести в таблицу: одна принимает много строковых значений, а вторая принимает только 4 значения. Я хочу свести в таблицу строковые значения по 4 категориям. Мне нужно, чтобы они были отсортированы. Я пробовал несколько команд, в том числе tabsort, которая работает, но только если я ограничу количество строк, которые она использует, до первых 603 (по крайней мере, с учетом того, как она сортируется в настоящее время). Если количество строк больше этого, я получаю ошибку r(134) о том, что значений слишком много. Есть ли что-нибудь сделать? Моя цель — создать таблицу с наиболее распространенными словами и экспортировать ее в LaTeX. Было бы намного проще попытаться сделать это в чем-то вроде R?


person bill999    schedule 07.06.2016    source источник
comment
Как вы хотите, чтобы они были отсортированы?   -  person Dimitriy V. Masterov    schedule 08.06.2016
comment
Да, я должен был быть более ясным. Я хочу, чтобы они были отсортированы по частоте, чтобы наиболее часто встречающиеся слова отображались вверху. Я не придирчив к тому, что именно это означает. Моя предпочтительная сортировка была бы той же сортировкой, которую можно было бы получить, не разделяя их на 4 значения (т. е. ту, которая была бы получена с использованием односторонней таблицы). Но также было бы хорошо, если бы он сортировался по частоте только по одному из столбцов.   -  person bill999    schedule 08.06.2016


Ответы (1)


Вот один из способов, через contract и texsave из SSC:

/* Fake Data */
set more off
clear
set matsize 5000
set seed 12345
set obs 1000
gen x = string(rnormal())
expand mod(_n,10)
gen y = mod(_n,4)

/* Collapse Data to Get Frequencies for Each x-y Cell */
preserve    
    contract x y, freq(N)
    reshape wide N, i(x) j(y)
    forvalues v=0/3 {
        lab var N`v' "`v'" // need this for labeling
        replace N`v'=0 if missing(N`v')
    }
    egen T = rowtotal(N*)
    gsort -T x // sort by occurrence
    keep if T > 0 // set occurrence threshold
    capture ssc install texsave
    texsave x N0 N1 N2 N3 using "tab_x_y.tex", varlabel replace title("tab x y")
restore

/* Check Calculations */
type "tab_x_y.tex"
tab x y, rowsort
person Dimitriy V. Masterov    schedule 07.06.2016
comment
После keep if T > 0 вы можете просто list x N? - person Nick Cox; 08.06.2016
comment
@NickCox Я думаю, что ОП хотела таблицу LaTeX, поэтому вывода вывода на экран было бы недостаточно. - person Dimitriy V. Masterov; 08.06.2016
comment
Конечно, но другие, заинтересованные в этой теме, не должны быть так ограничены. - person Nick Cox; 08.06.2016
comment
@NickCox С этой целью я думаю, что tab x y, rowsort было бы лучше. - person Dimitriy V. Masterov; 09.06.2016
comment
Да и нет. Если tabulate работает, то ладно. Но ОП уже сообщил, что его укусили ограничения на tabsort (не объяснено, но от SSC). Как его автор, я знаю, что tabsort — это просто оболочка для tabulate; так что tabulate здесь может работать не лучше, чем tabsort. Вот почему я рекомендую list. - person Nick Cox; 09.06.2016