将具有字符名称的因子转换为数字(从.sav文件导入后)

时间:2016-10-05 13:34:47

标签: r type-conversion

所以在我通过memsci导入了一个data.set(它的工作非常好btw!:)),我现在遇到的问题是几乎所有的数据都被转换为(非有序的)因子,但是水平不是1,2,3,4,5(计算时应该是这样),而是“完全同意”到“完全不同意”。

这导致了我无法使用as.numeric(levels(f))[f]将因子转换为数字的问题。

要导入我的数据,我使用了这个:

data <- as.data.set(spss.system.file("data.sav"))
dat <- as.data.frame(data)

但是:信息似乎就在那里。

str(var1)

Factor w/ 5 levels "don't agree at all",..: NA 1 1 1 1 1 1 1 1 1 ...

labels(dat$var1)
  [1] "1"   "2"   "3"   "4"   "5"   "6"   "7"   "8"   "9"   "10"  "11"  "12" 
 [13] "13"  "14"  "15"  "16"  "17"  "18"  "19"  "20"  "21"  "22"  "23"  "24"

levels(dat$var1)
[1] "do not agree at all" ". ."              ". . ."           
[4] ". . . ."          "fully agree"

值存储在哪里?我试过labels(var1)而只是var1,但我都没有。但是:使用as.numeric(var1)向我提供了我需要的信息,但我不认为应该按照R帮助中的说明应用这些因素。使用dat[,1:ncol(dat)] <- lapply(dat[,1:ncol(dat)], function(x) as.numeric(x))后 该变量仍被视为一个因素,其行为与以前完全相同。

编辑:感谢@jakub

的可重复示例
var1 <- factor(c(1,2,3,4,5,5,4,3,2,1), 
               levels = as.character(1:5),
               labels = c("Fully agree", "....", "...", "..", "Do not agree at all"))

1 个答案:

答案 0 :(得分:1)

你说:

  

as.numeric(var1)向我提供了我需要的信息,但我不认为应该按照R帮助中的说明应用这些因素

如果您参考:

  

特别是,as.numeric应用于某个因素是没有意义的,可能是通过隐式强制发生的。

那么你很可能会混淆两个问题。您要么需要标签,要么需要级别

如果您的数值碰巧是因子的标签,那么您确实必须使用as.numeric(levels(f))[f]转换为数字。一个例子:

var1 <- factor(c(1,2,3,1), 
               labels = c("123", "5", "-11"),
               levels = as.character(1:3))
levels(var1)
# [1] "123" "5"   "-11"
as.numeric(var1)
# [1] 1 2 3 1  #this indeed does not make much sense - the values are lost!
as.numeric(levels(var1))[var1]
#[1] 123   5 -11 123

但在你的情况下,这不适用,因为(如果我理解正确),你不需要标签,而是底层整数。对您而言,Fully agree表示1是有道理的。在这种情况下,as.numeric(var1)没问题。