我有一个包含因子的 R 数据框,我希望将其“展开”,以便于在新数据框中为每个因子水平创建一个对应列,其中包含 1/0 指示器。例如,假设我有以下数据框:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
我想要:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
因为对于某些分析,需要完全由数字组成的数据框(例如主成分分析),所以我认为这个功能可能已经被内置。编写一个函数来做这件事不应该太难,但我可以预见到一些与列名相关的挑战。如果已经存在类似的东西,我宁愿使用那个。
?formula
和?model.matrix
的第二段,但不太明确(可能是我在矩阵代数和模型制定方面知识不够深)。经过更多调查,我发现-1只是指定不包括“截距”列。如果你省略-1,你会在输出中看到一个由1组成的截距列,还有一列二进制列被遗漏了。你可以根据其他列的值为0的行来确定被遗漏的列的值为1的位置。文档似乎比较晦涩 - 是否有其他好的资源可用? - Ryan Chasemodel.matrix(~., data=iris)[,-1]
- user890739na.exclude
后使用naresid
将缺失值放回去。一个快速的例子:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
- Greg Snow