【发布时间】:2016-07-28 14:38:20
【问题描述】:
我对@987654321@ 很陌生,对Stata 比较熟悉。
我设法使用library(foreign) 将数据库从Stata 读取到R data.frame。
data=read.dta("mydata.dta",
convert.dates = TRUE,
convert.factors = TRUE,
missing.type = FALSE,
convert.underscore = FALSE,
warn.missing.labels = TRUE)
值(在Stata语言的意义上)没有被导入,只有标签被导入。
让我再解释一下。假设我想操作一个名为“edu”的教育变量。在 Stata 语言中,我使用 numeric values 而不是 labels 来操作我的变量,并且数据编辑器会显示标签,只要我定义了我的标签。例如,假设我的变量“edu”取值 10 到 40,以下代码将标签与每个值相关联:
label define lib_edu
10 "Less than high-school degree"
20 "12th grade or higher, no college degree"
30 "Undergraduate level (2 to 4 years of college)"
40 "Graduate level (5 years of college or more)", add;
label values edu lib_edu;
然后,当我想操作我的变量时,我需要使用这些值。例如,如果我想从我的数据集中删除标签低于高中学历的人,我只需这样做:
drop if edu==10
但是在我导入的Rdata.frame 中,标签被作为因子导入。每个因素都关联一个级别,该级别不一定对应于我的 Stata 值,因为它从 1 重新开始。同时,我不能使用级别来操纵我的变量。如果我想从我的数据集中删除标签低于高中学历的人,我必须写下整个标签:
data <- data[data$edu!="Less than high-school degree",]
这一点都不方便,尤其是标签又长又复杂的时候。
如果我的数据是从 Stata 导出的,是否可以像在 Stata 中一样,即:在编辑带有标签的 data.frame 时操作数值?
提前谢谢你。
【问题讨论】:
-
是的,R 因子的整数代码总是从 1 开始计数。但是,一旦您知道新代码,您应该能够像
f = factor(c("a","b")); f[ labels(f)[f] != 1 ]一样使用它们(不包括“a”,它的代码为 1)。就个人而言,我将长标签映射到缩写词并使用这些缩写词(“none”、“hs”、“ug”、“g”) -
我从您的回答中得知 1)无法重复使用 Stata 整数代码(至少在直接将数据导入 R 时不会);但是 2) 可以使用 R 新级别;但是 3) 将长标签转换为短标签的方法仍然不那么繁琐。感谢您的帮助。
-
是的。哦,还有一件事,R 的一个好处:您可以使用有序因子并使用不等式,取最大值和最小值等:
f = factor(c("hs", "hs", "none", "g"), levels=c("none","hs","ug","g"), ordered=TRUE); f[ f >= "ug" ]