将数据从宽格式转换为长格式,保留dv的所有替代方法并添加选择变量

我尝试使数据与中的软件包一起使用。我无法使用mlogit.data命令将宽数据格式转换为长格式,因此我自己使用melt进行了尝试。

到目前为止,这是我所拥有的(case是大小写标识符,dv是因变量,table是宽格式的数据,newdata在长格式):

case<-c(1,2,3)
dv<-c(1,3)
table<-as.data.frame(cbind(IssueID,dv))

newdata<-melt(setDT(table),id.vars = c("IssueID"),measure.vars = c("dv"))

宽格式:

   case dv
1:    1  1
2:    2  2
3:    3  3

长格式:

   IssueID variable value
1:       1       dv     1
2:       2       dv     2
3:       3       dv     3

但是,要使用mlogit运行数据,我需要一个数据集,其中包含每种情况下因变量的所有值,以及一个虚拟对象,该虚拟对象存储信息以观察单位选择了这些备选方案中的哪个。

可用数据应如下所示:

#case2<-c(1,1,3,3)
#variable2<-(c("dv","dv","dv"))
#value2<-c(1,3)
#choice2<-c(1,1)
#newdata2<-as.data.frame(cbind(case2,variable2,value2,choice2))

  case2 variable2 value2 choice2
1     1        dv      1       1
2     1        dv      2       0
3     1        dv      3       0
4     2        dv      1       0
5     2        dv      2       1
6     2        dv      3       0
7     3        dv      1       0
8     3        dv      2       0
9     3        dv      3       1

您对执行此操作的代码有什么建议,这样就不必手动编写选择变量了?谢谢您的协助。

lrslrslrs 回答:将数据从宽格式转换为长格式,保留dv的所有替代方法并添加选择变量

可能,您可以使用completefill从长格式的数据中实现这一目标。

library(dplyr)
library(tidyr)

df %>%
  mutate(choice = 1) %>%
  complete(IssueID,value = seq(min(value),max(value)),fill = list(choice = 0)) %>%
  fill(variable)


#  IssueID value variable choice
#    <int> <int> <fct>     <dbl>
#1       1     1 dv            1
#2       1     2 dv            0
#3       1     3 dv            0
#4       2     1 dv            0
#5       2     2 dv            1
#6       2     3 dv            0
#7       3     1 dv            0
#8       3     2 dv            0
#9       3     3 dv            1

数据

df <- structure(list(IssueID = 1:3,variable = structure(c(1L,1L,1L),.Label = "dv",class = "factor"),value = 1:3),class = "data.frame",row.names = c(NA,-3L))
,

您可以使用expand.grid使用case和dv的所有排列创建一个数据帧。然后在match d列上paste

res <- transform(cbind(with(dat,expand.grid(case=case,dv=dv)),var="dv"),choice=0)
res$choice[match(Reduce(paste,dat),Reduce(paste,res[1:2]))] <- 1
res
#   case dv var choice
# 1    1  1  dv      1
# 2    2  1  dv      0
# 3    3  1  dv      0
# 4    1  2  dv      0
# 5    2  2  dv      1
# 6    3  2  dv      0
# 7    1  3  dv      0
# 8    2  3  dv      0
# 9    3  3  dv      1

数据

dat <- data.frame(case=1:3,dv=1:3)
,

您可以按以下方式使用软件包data.table

library(data.table)
setDT(df,key = c("IssueID","value"))

df2 <- df[CJ(1:3,1:3),.(IssueID,variable = "dv",value,choice = +!is.na(variable))]

df2
#        IssueID variable value choice
#     1:       1       dv     1      1
#     2:       1       dv     2      0
#     3:       1       dv     3      0
#     4:       2       dv     1      0
#     5:       2       dv     2      1
#     6:       2       dv     3      0
#     7:       3       dv     1      0
#     8:       3       dv     2      0
#     9:       3       dv     3      1

数据

df <- structure(list(IssueID = 1:3,-3L))
本文链接:https://www.f2er.com/2553296.html

大家都在问