从互斥的虚拟变量创建分类变量

roo*_*ody 9 r categorical-data dummy-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
Run Code Online (Sandbox Code Playgroud)

我现在想制作结合ACROSS不同类型条件的分类变量.例如,具有条件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
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用ifelse()语句这样做,这很简单就是一个热点(而且并不总是有效).请帮忙!可能有一些非常明显的"更简单的方法".

编辑:

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

attach(df)
df$factor<-ifelse(conditionA==1 | conditionB==1, 1, NA)
df$factor<-ifelse(conditionA==2 | conditionB==2, 2, df$factor)
Run Code Online (Sandbox Code Playgroud)

实际上,我每次都将6-8列合并,所以更优雅的解决方案会有很大帮助.

krl*_*mlr 5

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

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

#library(devtools)
#install_github('kimisc', 'muelleki')
library(kimisc)

df$factor1 <- with(df, coalesce.na(conditionA, conditionB))
Run Code Online (Sandbox Code Playgroud)

(我不确定这是否适用于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')
Run Code Online (Sandbox Code Playgroud)