从R中的`label attribute`到SPSS中的`VARIABLE LABELS`的信息

时间:2012-04-16 21:06:39

标签: r export labels spss

我在R工作,但我需要提供一些SPSS格式的数据,包括“变量标签”和“价值标签”,我有点卡住了。

我使用Hmisc的{​​{1}}函数为我的数据添加了变量标签。这会将变量标签添加为label,这在使用label attribute包中的describe()时非常方便。问题是我无法从Hmisc包中获取write.foreign()函数,将这些标签识别为变量标签。我想我需要修改foreign,以便在编写write.foreign()文件时将label attribute用作variable label

我查看了R列表和stackoverflow,但我只能找到a post from 2006 on the R list regarding exporting varibles labels to SPSS from R,但它似乎没有回答我的问题。

这是我的工作示例,

.sps

当我检查# First I create a dummy dataset df <- data.frame(id = c(1:6), p.code = c(1, 5, 4, NA, 0, 5), p.label = c('Optometrists', 'Nurses', 'Financial analysts', '<NA>', '0', 'Nurses'), foo = LETTERS[1:6]) # Second, I add some variable labels using label from the Hmisc package # install.packages('Hmisc', dependencies = TRUE) library(Hmisc) label(df) <- "Sweet sweet data" label(df$id) <- "id !@#$%^" label(df$p.label) <- "Profession with human readable information" label(df$p.code) <- "Profession code" label(df$foo) <- "Variable label for variable x.var" # modify the name of one varibes, just to see what happens when exported. names(df)[4] <- "New crazy name for 'foo'" # Third I export the data with write.foreign from the foreign package # install.packages('foreign', dependencies = TRUE) setwd('C:\\temp') library(foreign) write.foreign(df,"df.wf.txt","df.wf.sps", package="SPSS") list.files() [1] "df.wf.sps" "df.wf.txt" 文件时(请参阅下面的“df.wf.sps”内容),我的.sps与我的variable labels相同,但我重命名为foo的foo除外“'foo'的新名字。”这个变量有一个新的,似乎是随机的名称,但是正确的variable names

有谁知道如何将标签属性和变量名称导出为“变量标签”和“标签名称”到variable label.文件中?也许有一种更智能的方法来存储'变量标签'然后是我当前的方法?

非常感谢任何帮助。

谢谢,Eric

使用.sps包中的write.foreign导出'df.wf.sps'的内容

foreign

2012年4月16日15:54:24 PDT更新;

我正在寻找的是一种调整DATA LIST FILE= "df.wf.txt" free (",") / id p.code p.label Nwcnf.f. . VARIABLE LABELS id "id" p.code "p.code" p.label "p.label" Nwcnf.f. "New crazy name for 'foo'" . VALUE LABELS / p.label 1 "0" 2 "Financial analysts" 3 "Nurses" 4 "Optometrists" / Nwcnf.f. 1 "A" 2 "B" 3 "C" 4 "D" 5 "E" 6 "F" . EXECUTE. 来编写write.foreign文件的方法,其中

.sps

看起来像这样,

[…] 

VARIABLE LABELS
 id "id" 
 p.code "p.code" 
 p.label "p.label" 
 Nwcnf.f. "New crazy name for 'foo'" 

[…] 

最后一行有点雄心勃勃,我真的不需要在名称中有一个带空格的变量,但我希望将标签属性转移到.spas文件(我用R生成) 。

2 个答案:

答案 0 :(得分:4)

尝试此功能,看看它是否适合您。如果没有,请添加评论,我可以看到在故障排除方面我能做些什么。

# Step 1: Make a backup of your data, just in case
df.orig = df
# Step 2: Load the following function
get.var.labels = function(data) {
  a = do.call(llist, data)
  tempout = vector("list", length(a))

  for (i in 1:length(a)) {
    tempout[[i]] = label(a[[i]])
  }
  b = unlist(tempout)
  structure(c(b), .Names = names(data))
}
# Step 3: Apply the variable.label attributes
attributes(df)$variable.labels = get.var.labels(df)
# Step 4: Load the write.SPSS function available from
# https://stat.ethz.ch/pipermail/r-help/2006-January/085941.html
# Step 5: Write your SPSS datafile and codefile
write.SPSS(df, "df.sav", "df.sps")

上面的示例假设您的数据名为df,并且您已使用Hmisc添加标签,如您在问题中所述。

更新:自包含功能

如果您不想更改原始文件(如上例所示),并且在使用此功能时连接到互联网,则可以尝试使用此自包含功能:

write.Hmisc.SPSS = function(data, datafile, codefile) {
  a = do.call(llist, data)
  tempout = vector("list", length(a))

  for (i in 1:length(a)) {
    tempout[[i]] = label(a[[i]])
  }
  b = unlist(tempout)
  label.temp = structure(c(b), .Names = names(data))
  attributes(data)$variable.labels = label.temp
  source("http://dl.dropbox.com/u/2556524/R%20Functions/writeSPSS.R")
  write.SPSS(data, datafile, codefile)
}

用法很简单:

write.Hmisc.SPSS(df, "df.sav", "df.sps")

答案 1 :(得分:1)

您链接到(here)的功能应该有效,但我认为问题是您的数据集实际上并不需要variable.labellabel.table属性编写SPSS脚本文件。

我无法访问SPSS,但请尝试以下操作,看看它是否至少指向了正确的方向。不幸的是,除了手动编辑dput的输出外,我看不到一种简单的方法。

df = structure(list(id = 1:6, 
               p.code = c(1, 5, 4, NA, 0, 5), 
               p.label = structure(c(5L, 4L, 2L, 3L, 1L, 4L), 
                                   .Label = c("0", "Financial analysts",
                                              "<NA>", "Nurses", 
                                              "Optometrists"), 
                                   class = "factor"), 
               foo = structure(1:6, 
                               .Label = c("A", "B", "C", "D", "E", "F"), 
                               class = "factor")), 
               .Names = c("id", "p.code", "p.label", "foo"),
          label.table = structure(list(id = NULL,
                             p.code = NULL,
                             p.label = structure(c("1", "2", "3", "4", "5"),
                                      .Names = c("0", "Financial analysts", 
                                                 "<NA>", "Nurses", 
                                                 "Optometrists")),
                             foo = structure(1:6, 
                                  .Names = c("A", "B", "C", "D", "E", "F"))),
                             .Names = c("id", "p.code", "p.label", "foo")),
          variable.labels = structure(c("id !@#$%^",  "Profession code", 
                                 "Profession with human readable information",
                                 "New crazy name for 'foo'"), 
                            .Names = c("id", "p.code", "p.label", "foo")), 
          codepage = 65001L)

将上述内容与样本数据集的dput输出进行比较。请注意,我已添加了label.tablevariable.labels,并且删除了说row.names = c(NA, -6L), class = "data.frame"之类的行。

更新

注意:这不适用于R中的默认write.foreign函数。要对此进行测试,首先需要加载write.SPSS函数shared here,然后(当然),make确保您已加载foreign包。然后,按如下方式编写文件:

write.SPSS(df, datafile="df.sav", codefile="df.sps")