Przekształciłem moje dane w szeroki format za pomocą funkcji MLOGIT.DATA, aby móc wykonać multinomialny regresję Logit Mlogit w R. Dane mają trzy różne "wybory" i wygląda tak (w swoim szerokim formacie):

Observation  Choice  Variable A  Variable B  Variable C
     1          1         1.27       0.2         0.81        
     1          0         1.27       0.2         0.81           
     1         -1         1.27       0.2         0.81 
     2          1         0.20       0.45        0.70
     2          0         0.20       0.45        0.70      
     2         -1         0.20       0.45        0.70

Jednakże, ponieważ zmienne A, B i C są powiązane z różnymi wynikami, które chciałbym utworzyć nową zmienną, która wygląda tak:

Observation  Choice  Variable A  Variable B  Variable C  Variable D
     1          1         1.27       0.2         0.81        1.27
     1          0         1.27       0.2         0.81        0.2
     1         -1         1.27       0.2         0.81        0.81
     2          1         0.20       0.45        0.70        0.20
     2          0         0.20       0.45        0.70        0.45
     2         -1         0.20       0.45        0.70        0.70

Wypróbowałem następujący kod:

Variable D <- ifelse(Choice == "1", Variable A, ifelse(Choice == "-1", Variable B, Variable C))

Jednak funkcja IFELSE uważa tylko jeden wybór z każdej obserwacji, tworząc to:

Observation  Choice  Variable A  Variable B  Variable C  Variable D
     1          1         1.27       0.2         0.81        1.27
     1          0         1.27       0.2         0.81         -
     1         -1         1.27       0.2         0.81         -
     2          1         0.20       0.45        0.70         -
     2          0         0.20       0.45        0.70        0.2
     2         -1         0.20       0.45        0.70         -

Czy ktoś wie, jak to rozwiązać?

Dzięki!

0
carsentdum 26 luty 2019, 19:16

2 odpowiedzi

Najlepsza odpowiedź

Możesz utworzyć wybory mapowania tabeli do zmiennych, a następnie użyj match

choice_map <- 
  data.frame(choice = c(1, 0, -1), var = grep('Variable[A-C]', names(df)))

#   choice var
# 1      1   3
# 2      0   4
# 3     -1   5


df$VariableD <- 
  df[cbind(seq_len(nrow(df)), with(choice_map, var[match(df$Choice, choice)]))]


df
#   Observation Choice VariableA VariableB VariableC VariableD
# 1           1      1      1.27      0.20      0.81      1.27
# 2           1      0      1.27      0.20      0.81      0.20
# 3           1     -1      1.27      0.20      0.81      0.81
# 4           2      1      0.20      0.45      0.70      0.20
# 5           2      0      0.20      0.45      0.70      0.45
# 6           2     -1      0.20      0.45      0.70      0.70

Używane dane (usunięte spacje w kolbach)

df <- data.table::fread('
Observation  Choice  VariableA  VariableB  VariableC
     1          1         1.27       0.2         0.81        
     1          0         1.27       0.2         0.81           
     1         -1         1.27       0.2         0.81 
     2          1         0.20       0.45        0.70
     2          0         0.20       0.45        0.70      
     2         -1         0.20       0.45        0.70
', data.table = F)
0
IceCreamToucan 26 luty 2019, 16:56
df$`Variable D`= sapply(1:nrow(df),function(x){
  df[x,4-df$Choice[x]]
})
> df
  Observation Choice Variable A Variable B Variable C Variable D
1           1      1       1.27       0.20       0.81       1.27
2           1      0       1.27       0.20       0.81       0.20
3           1     -1       1.27       0.20       0.81       0.81
4           2      1       0.20       0.45       0.70       0.20
5           2      0       0.20       0.45       0.70       0.45
6           2     -1       0.20       0.45       0.70       0.70
0
boski 26 luty 2019, 16:29