【问题标题】:Converting imported dates from SPSS portable file via memisc通过 memisc 从 SPSS 便携式文件转换导入的日期
【发布时间】:2016-06-18 08:11:59
【问题描述】:

我已经自学使用 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 中的变量类型从“日期”更改为“字符串”并将其转换为 R日期使用:

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

希望我早点想到用简单的方法来做这件事!

【问题讨论】:

  • 10/11/1946 真的导入为 11,489,040,000 吗?在它之前发生的其他日期之后,它会在 12,000,000,000 秒后导入,这似乎很奇怪。
  • 谢谢本杰明,事实上它确实做到了,这就是为什么我认为这不仅仅是改变基础的问题。

标签: r spss


【解决方案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
}

【讨论】:

  • 非常感谢本杰明!我真的很感激。
【解决方案2】:

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

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

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

我尝试导出一个已知的 sav 文件,其日期变量的值在您发布为可移植的范围内并使用上述代码读取,原始数字与您报告的不匹配,即使是正值,所以我会谨慎对待数据。

但后来我尝试使用这样的已知来源进行 asPOSIXct 转换

as.POSIXct(dta$bdate, origin = "1582-10-15") 

和匹配的数字。请注意,原始日期是 10 月 15 日,而不是 14 日。如果日期可能包含时间部分,您可能需要将 tz 参数指定给 asPOSIXct

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多