Создание новой переменной в широком формате данных, R - PullRequest
0 голосов
/ 26 февраля 2019

Я преобразовал свои данные в широкий формат, используя функцию mlogit.data, чтобы иметь возможность выполнить многочленную логит-регрессию mlogit в R. Данные имеют три различных «выбора» и выглядят так (в широком формате):

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

Однако, поскольку переменные A, B и C связаны с различными результатами, я бы сейчас хотел создать новую переменную, которая выглядит следующим образом:

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

Я пробовал следующий код:

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

Однако функция ifelse рассматривает только один выбор из каждого наблюдения, создавая это:

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         -

Кто-нибудь знает, как решить эту проблему?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете создать выбор отображения таблицы для переменных и затем использовать 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

Используемые данные (удаленные пробелы в именах столбцов)

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