Перестраиваемая переменная дихотомии - PullRequest
0 голосов
/ 15 января 2019

У меня есть переменные с дихотомическими ответами, скажем ниже

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 голосов
/ 15 января 2019
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")  
0 голосов
/ 15 января 2019

Я пытался найти разумный ответ на это, но оказалось, что я не такой умный ;-)

Итак, вот одна попытка

Для каждого столбца сначала замените 1 именем этого столбца, а 0 - NA, используя lapply

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 s в конце строки, мы можем сделать это, используя 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...