r - 将虚拟变量转换为 R 中的单个分类变量?

标签 r

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

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)
)
我想要做的是转换变量 a , b , 和 c到单个类别,其中级别为 a , b , 和 c .但正如您所看到的,有时同一行中会出现 2 个变量。所以,我想要实现的是一个看起来像这样的数据框:
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(“b”,“b,c”,“b”,“a,b,c”,“a”,0,“b”,0,“a”,0)
)
我尝试使用:
apply(df[,c("a","b", "c")], 1, sum, na.rm=TRUE)
它总结了每个变量的数量……但我不确定如何将 2 个(或更多)变量组合成一个单一的因子水平!?
关于我如何做到这一点的任何建议?

最佳答案

按行遍历所选列( MARGIN = 1 ),对值为 1 和 paste 的列名进行子集化他们在一起

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"       ""       
如果我们想改变""到“0”
df$z[df$z == ''] <- '0'
对于带有 purrr 和 dplyr 的解决方案:
df %>% mutate(z = pmap_chr(select(., a, b, c), ~  {v1 <- c(...); toString(names(v1)[v1 == 1])}))

关于r - 将虚拟变量转换为 R 中的单个分类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67389797/

相关文章:

r - 使用两个比例颜色渐变ggplot2

r - 使用 R 搜索和替换

r - 使用R-当值重复少于3次时删除行

R:从矩阵中提取相对于行/列位置的值

r - 在点阵图中的 y 轴上显示 "0"标签

r - 当 parse=TRUE 时将 geom_text 更改为粗体

r - 在 R 中使用带有 SSlogis() 和 predict() 的 nls() 的未知错误消息

r - 如何将 geom_box 中的填充 alpha 设置为因子中的观察数

r - 如何使用 R 在 Vim 缓冲区中向上滚动(使用 Nvim-R)

r - 如何在不迭代的情况下将元素插入向量中的多个位置