创建宽数据格式R的新变量

时间:2019-02-26 16:16:40

标签: r mlogit

我已使用mlogit.data函数将数据转换为宽格式,以便能够在R中执行mlogit多项式logit回归。数据具有三个不同的“选择”,并且看起来像这样(宽格式) ):

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 :(得分:0)

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

答案 1 :(得分:0)

您可以创建一个将选项映射到变量的表,然后使用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)