【问题标题】:How to extract the codes from a factor如何从因子中提取代码
【发布时间】:2012-04-30 15:49:01
【问题描述】:

首先,如果我的问题不是很清楚,我想提前道歉。我对 R 完全陌生,我的术语不会那么好。

我们从外部公司获得一个包含调查数据的 SPSS 文件。我们有一个 R 脚本来提取数据并将其写入 CSV 文件。这很好用。

脚本的第二部分为所有可能的问题构建了一个 INI 样式的文件。例如,对于 AGE,我们会有类似

[ AGE ]
1 = Under 13
2 = 13 - 15
3 = 15 - 25
4 = 25+

CSV 文件的每一行将有 1、2、3 或 4 之一。直到最近,所有可能的答案都从 1 开始编号,但现在其中一些从 0 开始。因此我们希望有类似的东西:

[ AGE ]
0 = Under 13
1 = 13 - 15
2 = 15 - 25
3 = 25+

以下是我们当前使用的 R 代码。我知道哪里出了问题,但我不知道如何改正。

data<-read.spss(inputFile, to.data.frame=TRUE);
fileOut<- file(valuesExportFile, "w");
for (name in names(data)) {
  cat("[", name,"]\n", file=fileOut);
  variableValues<-levels(data[[name]]);
  numberOfValues<-nlevels(data[[name]]);
  if (numberOfValues > 0) {
     for (i in 1:numberOfValues) {
         cat(i, '= "', variableValues[i], '"', "\n", file=fileOut);
     }
  }
};
close(fileOut);

我花了一天半的时间在谷歌上搜索并尝试了各种方法。我确实找到了一个 perl 脚本 spssread.pl,它可以根据需要提取数据,但由于某种原因,所有标签名称都是大写的,这是不可接受的,因为它们区分大小写。我会继续研究这个脚本,但与此同时,我想看看是否有使用 R 的解决方案,因为这是我们已经使用的,并且将所有内容都放在一个脚本中会很好。

那么,有什么建议吗?

【问题讨论】:

  • 只是一个想法:cat(i-1,...)?
  • ...那么它在哪里以及如何出错?只是@joran 建议的-1 还是有其他问题?
  • 我不能简单地使用cat(i-1,...),因为有些以 1 开头,有些以 0 开头。如果我用 PSPP 打开数据文件并查看“变量视图”选项卡,我可以看到这些值是排序正确,有些从 0 开始,有些从 1 开始。所以我想一定有一种方法可以从 SPSS 文件中提取该信息。
  • 如果不将as.data.frame=TRUE 参数包含到read.spss,您是否查看过返回的数据结构?根据帮助页面,有一个属性label.table 包含(可能更多)关于值标签的信息,而不是 data.frame 所包含的信息。
  • 谢谢布赖恩。虽然你的建议,使用label.table 不起作用,但它让我朝着正确的方向前进。

标签: r spss


【解决方案1】:

感谢 Brian Diggs,我能够探索另一种方式并找到了解决方案,虽然不是一个完美的解决方案。

我的解决方案是使用use.value.labels=FALSE 提取数据,然后取消分类变量并使用value.labels 属性。我认为显示代码比我试图解释它更清楚。

data<-read.spss(inputFile, to.data.frame=TRUE, use.value.labels=FALSE);
fileOut<- file(valuesExportFile, "w");
for (name in names(data)) {
    cat("[", name,"]\n", file=fileOut);
    variables<-attr(unclass(data[[name]]), "value.labels");
    for (label in names(variables)) {
        cat(variables[[label]], '= "', label, '"', "\n", file=fileOut);
    }
};
close(fileOut);

结果

[ AGE ]
8 = " 65+ "
7 = " 55 to 64 "
6 = " 45 to 54 "
5 = " 35 to 44 "
4 = " 25 to 34 "
3 = " 21 to 24 "
2 = " 16 to 20 "
1 = " 13 to 15 "
0 = " Under 13 "

虽然可行,但并不理想。有谁知道我如何对它们进行排序以便拥有

[ AGE ]
0 = " Under 13 "
1 = " 13 to 15 "
2 = " 16 to 20 "
3 = " 21 to 24 "
4 = " 25 to 34 "
5 = " 35 to 44 "
6 = " 45 to 54 "
7 = " 55 to 64 "
8 = " 65+ "

编辑:2012 年 4 月 5 日

在 Brian Diggs 的更多帮助(参见 cmets)之后,最终的解决方案是

data<-read.spss(inputFile, to.data.frame=TRUE, use.value.labels=FALSE);
fileOut<- file(valuesExportFile, "w");
for (name in names(data)) {
    cat("[", name,"]\n", file=fileOut);
    variables<-attr(unclass(data[[name]]), "value.labels");
    variables<-variables[order(as.numeric(variables))];
    for (label in names(variables)) {
        cat(variables[[label]], '= "', label, '"', "\n", file=fileOut);
    }
};
close(fileOut);

【讨论】:

  • 或许,在for循环之前,添加variables &lt;- sort(variables)?未经测试。这个想法是让variables 进入正确的顺序,这样当你循环遍历它时,它就会按照你想要的顺序打印。
  • 谢谢布赖恩。如果我的元素少于 10 个,它可以正常工作。我认为排序不是以数字方式完成的,因此“10”在“2”之前。
  • 是的,它是按词汇排序,而不是按数字排序。试试variables &lt;- variables[order(as.numeric(variables))] 这会从variables 的数字版本而不是字符串版本中获取排序顺序。
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 2014-01-04
  • 2012-05-25
  • 2011-08-09
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多