首页 文章

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

提问于
浏览
0

我一直在教自己使用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) .

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

EDIT:

感谢大家的回复,我设法解决了这个问题,虽然我不确定为什么会这样 .

我通常在保存和导入数据时使用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 回答

  • 1

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

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

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

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

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

  • 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
    }
    

相关问题