通过memisc从SPSS便携式文件转换导入的日期

时间:2016-06-18 08:12:00

标签: r spss

我一直在教自己使用R大约6个月,并发现当我在网上找不到解决方案时,这或者是一个模糊的问题,或者很明显没有人会问过它。

我认为这是后者。

基本上我使用以下方法通过R的memisc包导入了一个SPSS文件:

misc.MP.data <- as.data.frame(
as.data.set(
spss.portable.file("SPSS data.por")))

一切都很有效,除了日期似乎是以我不熟悉的数字格式导入的(我没有运气在网上找到类似的东西)。

例如:

  • 10/11/1946进口货号:11,489,040,000
  • 23/11/1946进口货品:-1,394,738,688
  • 11/12/1946进口货物:-1,393,183,488
  • 18/12/1946进口货品:-1,392,578,688

虽然我意识到R和SPSS的日期有不同的参考点,但基于此调整它们并没有让我到处(例如通过this function)。

无论如何,任何帮助将不胜感激。

编辑:

感谢大家的回复,我设法解决了问题,但我不确定它究竟是为什么会发生。

我在保存和导入数据时通常使用csv格式,但是,在这个例子中,我正在教一个本地组织试图从SPSS转移到R如何轻松地将数据导入R.

我没有SPSS所以我使用PSPP来阅读和理解SPSS文件以检查导入是否成功。但是,我在尝试使用R中的'foreign'命令等导入.sav文件时发现变量标签无法正确导入。

经过一些试验和错误后,我发现通过PSPP保存为便携式格式文件,并通过memisc包中的read.portable命令导入似乎效果最好,除了如上所述导入日期(包括奇怪的10/11) / 1946一)。

虽然我意识到SPSS和R使用不同的日期基础,但最初我注意到导入的SPSS日期似乎与正确的日期没有共享预期的线性关系(见下图):  Imported date vs. correct date scatter

虽然我没有弄清楚为什么会发生这种情况,但对于那些可能遇到类似问题的人来说,我使用的解决方案是将PSPP中的变量类型从'date'更改为'string'并将其转换为R日期使用:

as.Date(MP.data$dob, format = "%d-%b-%Y")

希望我早点想到这么简单!

2 个答案:

答案 0 :(得分:1)

我没有声称理解原因,但您的约会的来源似乎是1991-02-02 19:24:48 EST。我是如何决定的?

我将您的已知日期转换为POSIXct个对象

dt <- c("23/11/1946", "11/12/1946", "18/12/1946")
dt <- as.POSIXct(dt, format = "%d/%m/%Y")

您的数值为负数。我把它们放在一个向量中,但也知道要找到原点,我需要添加乘法逆。

num <- c(-1394738688, -1393183488, -1392578688)
dt + num * -1

同样,我不知道为什么会这样。但至少,您可以确定转换所依据的来源。您甚至可以将其捆绑到一个函数中以帮助您将来:

find_origin <- function(known_date, known_numeric, ...)
{
  #* ... additional arguments to as.POSIXct
  as.POSIXct(known_date, ...) + known_numeric * -1
}

答案 1 :(得分:1)

请记住,不推荐使用可移植文件格式,并且不支持统计信息的所有功能。它不支持Unicode模式或长变量名称。如果您可以控制数据的保存方式,请使用提供的许多其他格式之一。

SPSS中的日期存储为浮点数,其值是自1582年10月14日以来的秒数。

我不知道spss.portable.file如何处理日期值,但是文档没有提到使用文件中的格式信息,这是知道它是日期值的唯一方法。

我试过,导出一个已知的sav文件,其日期变量的值在您发布的便携式范围内,并使用上面的代码读取,并且原始数字与您报告的内容不匹配,即使是正值,所以我会对这些数据持谨慎态度。

但后来我尝试使用像这样的已知来源进行asPOSIXct转换 as.POSIXct(dta $ bdate,origin =“1582-10-15”)
和匹配的数字。请注意,原始日期是10月15日,而不是14.如果日期可能有时间组件,则可能需要为asPOSIXct指定tz参数。