将虚拟变量转换为R中的单个范畴变量?

将虚拟变量转换为R中的单个范畴变量?,r,R,也有人问过类似的问题。然而,它们似乎并没有完全满足我的需要。例如,如果我有这样一个数据集: df <- data.frame( x = rnorm(10), y = rnorm(10), a = c(0,0,0,1,1,0,0,0,1,0), b = c(1,1,1,1,0,0,1,0,0,0), c = c(0,1,0,1,0,0,0,0,0,0), z = c(1,1,1,1,1,0,1,0,1,0) ) 我尝试使用: apply(df[,c("a&

也有人问过类似的问题。然而,它们似乎并没有完全满足我的需要。例如,如果我有这样一个数据集:

df <- data.frame(
  x = rnorm(10),
  y = rnorm(10),
  a = c(0,0,0,1,1,0,0,0,1,0),
  b = c(1,1,1,1,0,0,1,0,0,0),
  c = c(0,1,0,1,0,0,0,0,0,0),
  z = c(1,1,1,1,1,0,1,0,1,0)
)
我尝试使用:

apply(df[,c("a","b", "c")], 1, sum, na.rm=TRUE)
它将每个变量的数量相加。。。但我不知道如何将2个(或更多)变量组合成一个单一因素水平


关于如何执行此操作的任何建议?

按行循环选定的列(
MARGIN=1
),将值为1的列名子集并将它们粘贴在一起

df$z <-  apply(df[c('a', 'b', 'c')], 1, function(x) toString(names(x)[x ==1]))
df$z
#[1] "b"       "b, c"    "b"       "a, b, c" "a"       ""        "b"       ""        "a"       ""       
对于具有purrr和dplyr的解决方案:

df %>% mutate(z = pmap_chr(select(., a, b, c), ~  {v1 <- c(...); toString(names(v1)[v1 == 1])}))

df%>%mutate(z=pmap_-chr,select(,a,b,c),{v1@GuedesBF这里有一种方法
df%>%mutate(z=pmap_-chr,select(,a,b,c)),{v1就是这样。我在'c(…)中被遗漏了“函数。@GuedesBF有一个输入错误。我更新了itI,建议将其纳入未来的答案中reference@GuedesBF没关系,我想我会让别人来回答
df$z[df$z == ''] <- '0'
df %>% mutate(z = pmap_chr(select(., a, b, c), ~  {v1 <- c(...); toString(names(v1)[v1 == 1])}))