【问题标题】:Creating categorical variables from mutually exclusive dummy variables从互斥虚拟变量创建分类变量
【发布时间】:2013-04-14 15:48:39
【问题描述】:

我的问题是关于先前已回答的关于 combining multiple dummy variables into a single categorical variable 的问题的详细说明。

在之前提出的问题中,分类变量是由不互斥的虚拟变量创建的。就我而言,我的虚拟变量是互斥的,因为它们代表 2X2 受试者间因子设计中的交叉实验条件(这也有一个受试者内部组件,我没有在这里讨论),所以我不认为 interaction做我需要做的事。

例如,我的数据可能如下所示:

id   conditionA    conditionB    conditionC     conditionD
1    NA            1             NA             NA
2    1             NA            NA             NA
3    NA            NA            1              NA
4    NA            NA            NA             1
5    NA            2             NA             NA
6    2             NA            NA             NA
7    NA            NA            2              NA
8    NA            NA            NA             2

我现在想制作组合不同类型条件的分类变量。例如,具有条件 A 和 B 的值的人可能被编码为一个分类变量,而具有条件 C 和 D 的值的人。

id   conditionA    conditionB    conditionC     conditionD  factor1    factor2
1    NA            1             NA             NA          1          NA
2    1             NA            NA             NA          1          NA
3    NA            NA            1              NA          NA         1
4    NA            NA            NA             1           NA         1
5    NA            2             NA             NA          2          NA
6    2             NA            NA             NA          2          NA
7    NA            NA            2              NA          NA         2
8    NA            NA            NA             2           NA         2

现在,我正在使用ifelse() 语句执行此操作,这简直是一团糟(而且并不总是有效)。请帮忙!可能有一些超级明显的“更简单的方法”。

编辑:

我使用的ifelse命令的种类如下:

attach(df)
df$factor<-ifelse(conditionA==1 | conditionB==1, 1, NA)
df$factor<-ifelse(conditionA==2 | conditionB==2, 2, df$factor)

实际上,我每次都会合并 6-8 列,因此更优雅的解决方案会很有帮助。

【问题讨论】:

    标签: r categorical-data dummy-variable


    【解决方案1】:

    更新(2019):请使用dplyr::coalesce(),它的工作原理几乎相同。

    我的R package 有一个方便的功能,允许为向量列表中的每个元素选择第一个非NA 值:

    #library(devtools)
    #install_github('kimisc', 'muelleki')
    library(kimisc)
    
    df$factor1 <- with(df, coalesce.na(conditionA, conditionB))
    

    (如果conditionAconditionB 是因子,我不确定这是否有效。如有必要,在使用as.numeric(as.character(...)) 之前将它们转换为数字。)

    否则,您可以尝试interaction,并结合重新编码结果因子的水平——但在我看来,您似乎对第一个解决方案更感兴趣:

    df$conditionAB <- with(df, interaction(coalesce.na(conditionA, 0), 
                                           coalesce.na(conditionB, 0)))
    levels(df$conditionAB) <- c('A', 'B')
    

    【讨论】:

    • 谢谢!很好……当我编写示例数据时,最后两行出现错字。
    • @roody:conditionD 是否可以包含值,比如 3?那应该怎么办?
    • 不,它们都是两个水平因子变量——1 和 2 只是 Qualtrics 分配给它们的值,但它始终是一个二元选择。
    • @roody:你在 Windows 上吗?然后你可能需要安装Rtools。否则,安装 GNU 工具链(makeg++,...)。或者干脆从here复制代码...
    • @roody,另一种感谢方式是投票有用的答案。
    【解决方案2】:

    我认为这个功能可以满足您的需求(诚然,这是一个快速的 hack)。

    to_indicator <- function(x, grp)
    {
        apply(tbl, 1,
              function (x)
              {
                  idx <- which(!is.na(x))
                  nm <- names(idx)
                  if (nm %in% grp)
                    x[idx]
                  else
                    NA
              })
    }
    

    这是与您提供的示例数据一起使用的。

    tbl <- read.table(header=TRUE, text="
    conditionA    conditionB    conditionC     conditionD
    NA            1             NA             NA
    1             NA            NA             NA
    NA            NA            1              NA
    NA            NA            NA             1
    NA            2             NA             NA
    2             NA            NA             NA
    NA            NA            2              NA
    NA            NA            NA             2")
    tbl <- data.frame(tbl)
    
    (tbl <- cbind(tbl,
                  factor1=to_indicator(tbl, c("conditionA", "conditionB")),
                  factor2=to_indicator(tbl, c("conditionC", "conditionD"))))
    

    【讨论】:

      【解决方案3】:

      嗯,我认为您可以简单地使用ifelse 来完成,例如:

      factor1 <- ifelse(is.na(conditionA), conditionB, conditionA)
      

      另一种方式可能是:

      factor1 <- conditionA
      factor1[is.na(factor1)] <- conditionB
      

      第三种解决方案,如果你有两个以上的列条件,当然更实用:

      factor1 <- apply(df[,c("conditionA","conditionB")], 1, sum, na.rm=TRUE)
      

      【讨论】:

      • 嗨@juba - 我喜欢第三种解决方案的简单性......但是如果R将所有相关列作为因子读入,我该如何将它们更改为数字?命令df[cols] &lt;- as.numeric(as.matrix(df[cols])) 似乎不起作用(当cols 是列号列表时)。
      猜你喜欢
      • 2020-05-13
      • 2015-08-17
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2020-06-22
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多