我有一个Stata数据集,称之为dataset.dta
。我想在R中阅读它。我正在使用包foreign
。问题是它无法将Stata日期解析/转换为R日期。
它是这样的:
df <- read.dta( 'dataset.dta', convert.dates = TRUE )
# Check attributes
attr( df, "formats")
"%9s" "%8.0g" "%12.0g" "%12.0g" "%9.0g" "%21s" "%31s" "%td" "%td"
# Last two columns are dates i.e. %td
str( df )
... # Only showing last two columns
$ start_sample: num 15494 14246 14246 14670 14245 ...
$ end_sample : num 18262 18262 18262 18262 18262 ...
我期待这些Date class
,而不是num
。当我查看read.dta
的源代码时,我发现了这一点。
if (convert.dates) {
ff <- attr(rval, "formats")
dates <- grep("%-*d", ff)
base <- structure(-3653, class = "Date")
for (v in dates) rval[[v]] <- base + rval[[v]]
}
将此处的第三行更改为dates <- grep( "%*d", ff)
似乎可以解决此问题。我改变了正则表达式。我正在使用Stata版本13.0。
我错过了什么吗?这只是一个错误,还是我在这里做了一些可悲的错事?
答案 0 :(得分:0)
两个快速修复/黑客攻击。第一个是
#### Convert to dates ####
datelookup <- format(seq(as.Date("1960-01-01"), as.Date("2015-12-31"), by = "1 day"))
df$start_sample_ dates <- datelookup[ df$start_sample + 1]
df$start_sample_dates <- datelookup[ df$end_sample + 1]
Stata使用01/01/1960作为base。第二个是
#### Stealing from foreign package ####
ff <- attr(df, "formats")
dates <- grep("%*d", ff)
base <- structure(-3653, class = "Date")
for (v in dates) df[[v]] <- base + df[[v]]
为什么structure(-3653, class = "Date")
?请参阅上面的评论@Dimitriy V.Masterov。此问题可能特定于Stata版本13.0。见上面的评论@dickoa。谢谢你的帮助。