我一直在教自己使用R大约6个月,并发现当我在网上找不到解决方案时,这或者是一个模糊的问题,或者很明显没有人会问过它。
我认为这是后者。
基本上我使用以下方法通过R的memisc包导入了一个SPSS文件:
misc.MP.data <- as.data.frame(
as.data.set(
spss.portable.file("SPSS data.por")))
一切都很有效,除了日期似乎是以我不熟悉的数字格式导入的(我没有运气在网上找到类似的东西)。
例如:
虽然我意识到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")
希望我早点想到这么简单!
答案 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参数。