【问题标题】:Creating new variable in wide data format, R以宽数据格式创建新变量,R
【发布时间】:2019-02-26 16:16:40
【问题描述】:

我已使用 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         -

有人知道如何解决这个问题吗?

谢谢!

【问题讨论】:

    标签: r mlogit


    【解决方案1】:

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

    【讨论】:

    • 谢谢!另一个问题:当我尝试使用代码 mlog
    • 我认为这最好作为一个单独的问题提出。
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2021-06-13
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多