【发布时间】:2016-03-19 03:57:52
【问题描述】:
我有一个数据框,我想从中创建一个布尔数据框。我想将原始数据框中每一列的所有唯一值作为布尔数据框中的列名。用一个例子来展示它:
mydata =
sex route
m oral
f oral
m topical
f unknown
然后,我要创建
m f oral topical unknown
1 0 1 0 0
0 1 1 0 0
1 0 0 1 0
0 1 0 0 1
我正在使用下面的代码来创建布尔数据框。它在 R 中有效,但在 shiny 中无效。可能是什么问题?
col_names=c()
for(i in seq(1,ncol(mydata))){
col_names=c(col_names,unique(mydata[i]))
}
col_names= as.vector(unlist(col_names))
my_boolean= data.frame(matrix(0, nrow = nrow(mydata), ncol = length(col_names)))
colnames( my_boolean)=col_names
for(i in seq(1,nrow(mydata))){
for(j in seq(1,ncol(mydata)))
{
my_boolean[i,which(mydata[i,j]==colnames(my_boolean))]=1
}}
【问题讨论】:
-
尝试使用model.matrix:
model.matrix(~ sex + route - 1, mydata)更干净 -
我支持@NBATrends,但是,
model.matrix(~ sex + route - 1, my data)不会给你正确的结果,因为其中一个类别被用作基线。要解决这个问题,你可以这样做cbind(model.matrix(~ sex - 1, mydata), model.matrix(~ route - 1, mydata))。 -
您将不得不解释在 Shiny 中什么不起作用才能获得关于您问题的这一部分的帮助。
-
如果您要走
model.matrix路线,指定对比model.matrix(~.-1, mydata, contrasts=lapply(mydata,function(x) diag(nlevels(x))))可能更清楚 -
@AnandaMahto:你是对的。我应该提到我在 Shiny 中遇到的问题。现在,它使用您提供的代码工作。谢谢!!