【问题标题】:Creating a boolean data frame from a data frame in R从 R 中的数据框创建布尔数据框
【发布时间】: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 中遇到的问题。现在,它使用您提供的代码工作。谢谢!!

标签: r shiny


【解决方案1】:

有几种方法可以做到这一点,但我总是觉得table 最容易理解。这是table的一种方法:

do.call(cbind, lapply(mydf, function(x) table(1:nrow(mydf), x)))
##   f m oral topical unknown
## 1 0 1    1       0       0
## 2 1 0    1       0       0
## 3 0 1    0       1       0
## 4 1 0    0       0       1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2022-07-19
    相关资源
    最近更新 更多