以宽数据格式创建新变量,R

Creating new variable in wide data format, R

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

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         -

有人知道怎么解决吗?

谢谢!

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

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