在R中将多个二进制/分类列高效地组合为单个分类列

在R中将多个二进制/分类列高效地组合为单个分类列,r,data-manipulation,binary-data,categorical-data,R,Data Manipulation,Binary Data,Categorical Data,首先,我了解以下页面中的相关问题/答案 然而,我的问题略有不同,上述解决方案对我不起作用 给定一个包含可能重叠的二进制变量的数据集,将它们组合成单个分类列的最有效方法是什么 作为一个简单的例子,考虑下面的数据集 set.seed(12345) d1<-data.frame(score=rnorm(10), Male=sample(c(rep(1,5), rep(0,5))), White=sample(c(rep(1,5),

首先,我了解以下页面中的相关问题/答案

然而,我的问题略有不同,上述解决方案对我不起作用

给定一个包含可能重叠的二进制变量的数据集,将它们组合成单个分类列的最有效方法是什么

作为一个简单的例子,考虑下面的数据集

set.seed(12345)
d1<-data.frame(score=rnorm(10),
               Male=sample(c(rep(1,5), rep(0,5))), 
               White=sample(c(rep(1,5),rep(0,5))), 
               college_ed = rep(c(1,0),5))

head(d1,5)

      score   Male   White college_ed
1  0.5855288    1     0          1
2  0.7094660    1     1          0
3 -0.1093033    0     1          1
4 -0.4534972    0     1          0
5  0.6058875    1     1          1
set.seed(12345)

d1这不是一个完美的解决方案,但应该能让你更快地完成任务。if语句不进行矢量化,但ifelse()进行矢量化:请参见下文。。。。无需使用应用功能

set.seed(12345)
d1<-data.frame(score=rnorm(10),
               Male=sample(c(rep(1,5), rep(0,5))), 
               White=sample(c(rep(1,5),rep(0,5))), 
               college_ed = rep(c(1,0),5))

head(d1,5)

makeKey <- function(x,y,z){
  s1 <- ifelse(x == 1,"Male", "")
  s2 <- ifelse(y == 1, "White", "")
  s3 <- ifelse(z == 1, "college_ed", "")
  s4 <- paste(s1,s2,s3, sep = "-" )
  return(s4)
}

d1$key <- makeKey(x=d1$Male, y=d1$White, z=d1$college_ed)
set.seed(12345)

好建议!我意识到,如果我把示例数据集做得更大,比较处理时间可能会更好。当我将大小增加到100万行时,您的解决方案大约快了6倍。
set.seed(12345)
d1<-data.frame(score=rnorm(10),
               Male=sample(c(rep(1,5), rep(0,5))), 
               White=sample(c(rep(1,5),rep(0,5))), 
               college_ed = rep(c(1,0),5))

head(d1,5)

makeKey <- function(x,y,z){
  s1 <- ifelse(x == 1,"Male", "")
  s2 <- ifelse(y == 1, "White", "")
  s3 <- ifelse(z == 1, "college_ed", "")
  s4 <- paste(s1,s2,s3, sep = "-" )
  return(s4)
}

d1$key <- makeKey(x=d1$Male, y=d1$White, z=d1$college_ed)