强制R中的model.matrix()使用给定的一组级别

时间:2015-02-19 14:20:12

标签: r model.matrix

我需要将调查数据框中的少量分类变量转换为虚拟变量。变量按类型(例如食物类型)分组,并且在每种类型调查中,受访者对他们的第一,第二和第三偏好进行排名。每种类型的可用选择列表类似但不相同。我的问题是我想强制类别选择的超集在每种情况下都是虚拟编码。

set.seed(1)
d<-data.frame(foodtype1rank1=sample(c('noodles','rice','cabbage','pork'),5,replace=T),
              foodtype1rank2=sample(c('noodles','rice','cabbage','pork'),5,replace=T),
              foodtype1rank3=sample(c('noodles','rice','cabbage','pork'),5,replace=T),
              foodtype2rank1=sample(c('noodles','rice','cabbage','tuna'),5,replace=T),
              foodtype2rank2=sample(c('noodles','rice','cabbage','tuna'),5,replace=T),
              foodtype2rank3=sample(c('noodles','rice','cabbage','tuna'),5,replace=T),
              foodtype3rank1=sample(c('noodles','rice','cabbage','pork','mackerel'),5,replace=T),
              foodtype3rank2=sample(c('noodles','rice','cabbage','pork','mackerel'),5,replace=T),
              foodtype3rank3=sample(c('noodles','rice','cabbage','pork','mackerel'),5,replace=T))

总结一下,model.matrix()将为任何单个变量创建虚拟变量:

model.matrix(~d[,1]-1)
  d[, 1]cabbage d[, 1]noodles d[, 1]pork d[, 1]rice
1             0             0          0          1
2             0             0          0          1
3             1             0          0          0
4             0             0          1          0
5             0             1          0          0

或通过sapply()获取所有变量:

sapply(d,function(x) model.matrix(~x-1))

当然,model.matrix()只会分别考虑每个因素中存在的级别。但我想强制要求为每种类型包括完整的食物类型:面条,米饭,卷心菜,猪肉,金枪鱼,鲭鱼。在这个例子中,它将生成54个虚拟变量(3种类型×3级×6类)。我假设我会以某种方式明确地将整个集合传递给model.matrix(),但是无法看到。

最后,我知道R模型在内部自动伪代码因素,但我仍然需要这样做,包括在R外部导出。

1 个答案:

答案 0 :(得分:2)

实现这一目标的最佳方法是明确指定每个因素的级别:

d$foodtype1rank1=factor(sample(c('noodles','rice','cabbage','pork'), 5, replace=T), 
                        levels=c('noodles','rice','cabbage','pork','mackerel'))

当你知道数据时,这总是很好的做法。