read.dta convert.dates不工作?

时间:2014-01-23 17:23:37

标签: regex r date stata

我有一个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。

我错过了什么吗?这只是一个错误,还是我在这里做了一些可悲的错事?

1 个答案:

答案 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。谢谢你的帮助。