有人问过类似的问题 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/