重组二分法变量

时间:2019-01-15 15:29:55

标签: r

我有以下二分法回答的变量

Brand1       Brand2
   1              1
   0              1
   1              1
   1              0
   0              1

我需要重组以输出如下所示的新变量

Var1        Var2
Brand1      Brand2  
Brand2      NA
Brand1      Brand2
Brand1      NA
Brand2      NA

对于第1行,受访者仅选择了Brand1和Brand2,对于第2行,受访者仅选择了Brand 2,则只有第一个具有我们价值的变量,第二个变为None。我的变量超过1000,我以2个变量为例

2 个答案:

答案 0 :(得分:0)

我试图为此找到一个明智的答案,但事实证明我并不那么聪明;-)

这是一次尝试

对于每一列,首先使用lapply

将1替换为该列的名称,将0替换为NA。
df[] <- lapply(names(df), function(x) ifelse(df[[x]] == 1, x, NA))
df

#  Brand1 Brand2
#1 Brand1 Brand2
#2   <NA> Brand2
#3 Brand1 Brand2
#4 Brand1   <NA>
#5   <NA> Brand2

如果通过在行尾移动NA重新排列数据很重要,我们可以使用apply

as.data.frame(t(apply(df,1,function(x)  c(x[!is.na(x)],x[is.na(x)]))))

#      V1     V2
#1 Brand1 Brand2
#2 Brand2   <NA>
#3 Brand1 Brand2
#4 Brand1   <NA>
#5 Brand2   <NA>

答案 1 :(得分:0)

t(apply(df, 1, function(x) names(df)[as.logical(x)][1:length(x)]))
     [,1]     [,2]    
[1,] "Brand1" "Brand2"
[2,] "Brand2" NA      
[3,] "Brand1" "Brand2"
[4,] "Brand1" NA      
[5,] "Brand2" NA

数据

df <- structure(list(Brand1 = c(1L, 0L, 1L, 1L, 0L), Brand2 = c(1L, 
1L, 1L, 0L, 1L)), row.names = c(NA, -5L), class = "data.frame")