从Stata中的外部数据字典中分配值标签

时间:2015-12-01 14:39:50

标签: stata

我想使用已构造的数据字典label变量值。 最小数据集:

clear
input q1p0  q1p1    q2p0    q2p1    q2p2    q2p3
1   1   1   1   4   34
1   1   2   2   3   36
1   1   1   4   2   45
1   2   2   4   2   46
1   1   1   3   2   23
1   1   2   4   1   35
1   1   2   2   3   22
1   1   1   2   1   17
1   1   1   4   1   40
1   1   2   3   2   18
1   2   2   2   1   40
end

当然,通过手动阅读字典我会做的:

label define yesno 1 "Yes" 2 "No"
label values q1p0 q1p1 q2p0 yesno

label define workload 0 "No change" 1 "Very low workload" 2 "Low workload" 3 "More workload" 4 "A lot more workload" 98 "Don’t know"    
label values q2p1 q2p2 workload

label define yesnodont 1 "Yes" 2 "No" 98 "Don’t Know"   
label values q2p3 yesnodont

但是,我有许多需要标记的变量,因此使用循环的自动化方法会很有帮助。 最小字典:

clear
input str4 variable  str20 valuelabel value
q1p0    "Yes"   1
q1p0    "No"    2
q1p1    "Yes"   1
q1p1    "No"    2
q2p0    "Yes"   1
q2p0    "No"    2
q2p1    "No change" 0
q2p1    "Very low workload" 1
q2p1    "Low workload"  2
q2p1    "More workload" 3
q2p1    "A lot more workload"   4
q2p1    "Don’t know"    98
q2p2    "No change" 0
q2p2    "Very low workload" 1
q2p2    "Low workload"  2
q2p2    "More workload" 3
q2p2    "A lot more workload"   4
q2p2    "Don’t know"    98
q2p3    "Yes"   1
q2p3    "No"    2
q2p3    "Don't know"    98
end

上面数据集中的变量代表要命名的variablevaluelabel代表variable的特定类别和value { {1}}类别。

如何自动化流程?

我需要生成:

variable

之前已发布过一个相关问题,但该问题涉及标记变量而非值。 Stata: Assign labels to range of variables with a loop

在R中,我可以这样做: 首先创建最小字典:

clear
input str4 variable  strL labelstatement
q1p0    `"1 "Yes" 2 "No""'
q1p1    `"1 "Yes" 2 "No""'      
q2p0    `"1 "Increased" 2 "Decreased" 3 "No change" 98 "Don’t know""'   
q2p1    `"0 "No change" 1 "Very low workload" 2 "Low workload" 3 "More workload" 4 "A lot more workload" 98 "Don’t know""'  
q2p2    `"0 "No change" 1 "Very low workload" 2 "Low workload" 3 "More workload" 4 "A lot more workload" 98 "Don’t know""'  
q2p3    `"1 "Yes" 2 "No" 98 "Don’t Know""'      
end

现在创建最终将作为Stata代码执行的语句:

library(dplyr)

valuelabels <- read.table(text="variable valuelabel value
q1p0                 'Yes'     1
q1p0                  'No'     2
q1p1                 'Yes'     1
q1p1                  'No'     2
q2p0                 'Yes'     1
q2p0                  'No'     2
q2p1           'No change'     0
q2p1  'Very low workload'     1
q2p1        'Low workload'     2
q2p1       'More workload'     3
q2p1 'A lot more workload'     4
q2p1          'Don\\'t know'    98
q2p2           'No change'     0
q2p2   'Very low workload'     1
q2p2        'Low workload'     2
q2p2       'More workload'     3
q2p2 'A lot more workload'     4
q2p2          'Don\\'t know'    98
q2p3                ' Yes'     1
q2p3                  'No'     2
q2p3          'Don\\'t know'    98", 
                 header=T, stringsAsFactors=F)

给出:

valuelabels <- valuelabels %>%
  group_by(variable) %>%
  mutate(labelstatement=paste(value,'"',valuelabel,'"', collapse=' ', sep=''),
         labelstatement= gsub('"',' "', labelstatement),
         labelstatement1=paste("label define",variable, labelstatement),
         labelstatement2=paste("label values",variable, variable)) %>%
  select(variable,labelstatement1,labelstatement2) %>%
  slice(1)

2 个答案:

答案 0 :(得分:1)

让我们以您呈现标签的方式创建一个带有标签的数据集。第一, 让我们假设,让我们更容易理解,我们正在讨论 一个国家。让我们假设这个国家有4个州,每个州有4个区,每个州有4个镇。

这给了我们1 + 4 + 4 ^ 2 + 4 ^ 3 = 85个对象。

clear
set more off
set obs 85

gen name=""
replace name = "country" in 1
replace name = "state" in 2/5
replace name = "district" in 6/21
replace name = "town" in 22/85

bysort name: gen value = _n
gen label = name + strofreal(value)

大!现在我们有标签名称,值和标签本身。让我们继续将其保存为.dta文件以便稍后打开。您想引用.csv文件,但它完全相同。您稍后需要使用import delimited而不是use

tempfile labels
save `labels'

请注意,您需要将此全部集中在.do文件中,因为我正在引用临时文件。我建议将其复制/粘贴到.do文件中,而不是直接逐行输入。

现在我们需要创建一个需要标签的样本数据集,其中包含变量country,state,district和town。

clear
set more off
set obs 1

foreach x in country state district town {
    gen `x' = _n
    expand 4
    sort `x'
}
duplicates drop town, force

现在,有一个独特的国家,4个独特的州,16个独特的地区和64个独特的城镇。它们都是一个没有当前标签的整数变量。

现在我们将创建一个保留此数据的循环,然后使用我们想要的每个变量值的标签引用临时文件。

foreach x in country state district town {
    tempfile `x'do                              
    preserve                                        
        use `labels', clear                             // Reference the "labels" tempfile we made earlier
        keep if name == "`x'"                           // Keep only the rows where name is the name of the label we want to define
        qui sum value                                   // Allows me to reference r(N) later, the number of rows in the dataset
        forvalues i = 1/`r(N)' {                        // Inner loop generates value/label pair for each unique value of x
            local value = value[`i']                    // Pulls out the value for row 1, 2, 3,... etc.
            local label = label[`i']                    // Pulls out the label string for row 1, 2, 3,.. etc.
            label define `x' `value' "`label'", add     // Define and continuously add to label definition each time it loops
        }                                               // End inner loop
        label save `x' using ``x'do', replace           // Saves label instructions in temporary do file so we can access it after "restore"
    restore
    do ``x'do'                                          // Re-create the labels in our main dataset (they were lost after "restore")
    label values `x' "`x'"                              // Apply label to values                                
}                                                       // End outer loop

瞧!已生成并应用每个变量的标签。答案似乎很长,但请记住,我们必须首先创建模拟数据。如果您定义了标签,那么循环就是您真正需要的所有&#34; name&#34;标签文件中的内容与您要为其分配该值的变量名称相同。

答案 1 :(得分:0)

这是&#34;我不会从那里开始&#34;。但鉴于你有,假设你把这些细节读作数据。然后是单个命令

gen line = "label define " + variable + " " + string(value) + " " + char(34) + valuelabel + char(34) + ", modify" 

将创建一个变量line,其内容适合导出并作为do-file执行。

此处char(34)"个字符。还有其他方法可以确保添加文字引号,但风险相当低。

否则,你有成分文件的成分。您只需要添加一些文本并重新排序。

您可以混合使用此类指令和实际数据,只要文本可以包含在字符串变量中即可。但无论你做什么,这都是一种风格问题。 (我通常会找到任何喜欢的文本编辑器。)