我想使用已构造的数据字典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
上面数据集中的变量代表要命名的variable
,valuelabel
代表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)
答案 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)
是"
个字符。还有其他方法可以确保添加文字引号,但风险相当低。
否则,你有成分文件的成分。您只需要添加一些文本并重新排序。
您可以混合使用此类指令和实际数据,只要文本可以包含在字符串变量中即可。但无论你做什么,这都是一种风格问题。 (我通常会找到任何喜欢的文本编辑器。)