如何使用R中的指定偏好数据从长到宽

如何使用R中的指定偏好数据从长到宽,r,reshape,R,Reshape,我希望这不是一个交叉张贴。我一直试图从stackoverflow上的可用链接了解如何将数据从长变宽。我想我已经快到了,但是仍然有很多东西没有找到 我已经说明了关于选择电动汽车和汽油汽车的优先数据。一些变量通常与汽车相关,如PREZZO,而另一些变量则与电动汽车相关,如AUTONOMIA_EV,而其他变量则与内燃机汽车相关,如AUTONOMIA ICEV 每个响应者由INTERTOT列中的数字标识。第一被告的编号为111。有20行对应于这个人,因为他面临着两辆车中的10种选择,一辆是电动的,一辆

我希望这不是一个交叉张贴。我一直试图从stackoverflow上的可用链接了解如何将数据从长变宽。我想我已经快到了,但是仍然有很多东西没有找到

我已经说明了关于选择电动汽车和汽油汽车的优先数据。一些变量通常与汽车相关,如PREZZO,而另一些变量则与电动汽车相关,如AUTONOMIA_EV,而其他变量则与内燃机汽车相关,如AUTONOMIA ICEV

每个响应者由INTERTOT列中的数字标识。第一被告的编号为111。有20行对应于这个人,因为他面临着两辆车中的10种选择,一辆是电动的,一辆是汽油的。在SCELTAEFF2列中,等于1的值表示个人执行的选择。必须将该值与EV列中报告的相应值进行比较,其中值1表示该行中的选项为电动汽车

因此,例如,如果您查看第4行,它涉及第一个人面临的第二个选择,列SCELTAEFF2的值为1,列EV上的对应行也为1。这意味着,对于第二个备选方案,受访者选择电动汽车。相反,如果你看第8行,它涉及到第四种选择,个人选择汽油车。这种情况是因为列SCELTAEFF2的值为1,但列EV上的对应行为零

现在,我想让每个受访者,INTERTOT,只有一行,包含所有信息,现在分布在20行

我拥有的文件非常大,这就是为什么我只向你展示一部分

我想估算一个混合选择模型,并通过三角洲法计算支付意愿,但第一个问题是数据格式正确

我正在尝试的代码如下所示:

prova_reshape.wide = reshape(data = "prova_reshape", idvar = "INTERTOT", direction = "wide" )   
但是,当然,我会收到以下错误消息:

数据[,timevar]中的错误:标注错误的数值

因为我没有指定
timevar
。我没有,因为我不知道该放什么进去。此外,我不确定指定
idvar=“INTERTOT”
是否足够

我在网上查看了不同的来源,例如和

我想我可能很接近,但我不确定如何继续

如果有人能帮助我,我会很有帮助的

马可

以下是我的数据集摘录:

structure(list(QI = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), CSET = c(10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L), INTERTOT = c(111L, 111L, 111L, 111L, 111L, 
111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 
111L, 111L, 111L, 111L), NSCELTA = c(1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), SCELTAEFF2 = c(0L, 
1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 
1L, 1L, 0L), MARCA = c(4L, 1L, 1L, 2L, 1L, 4L, 4L, 2L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 2L, 4L, 3L, 1L), EV = c(1L, 0L, 1L, 0L, 
1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L
), PREZZO = c(25000L, 30000L, 25000L, 20000L, 30000L, 25000L, 
20000L, 15000L, 25000L, 15000L, 30000L, 20000L, 20000L, 25000L, 
35000L, 30000L, 20000L, 15000L, 35000L, 20000L), AUTONOMIA = c(150L, 
1200L, 150L, 800L, 150L, 400L, 350L, 400L, 250L, 400L, 350L, 
1200L, 150L, 800L, 350L, 800L, 250L, 1200L, 250L, 400L), AUTONOMIA_EV = c(150L, 
0L, 150L, 0L, 150L, 0L, 350L, 0L, 250L, 0L, 350L, 0L, 150L, 0L, 
350L, 0L, 250L, 0L, 250L, 0L), AUTONOMIA_ICEV = c(0L, 1200L, 
0L, 800L, 0L, 400L, 0L, 400L, 0L, 400L, 0L, 1200L, 0L, 800L, 
0L, 800L, 0L, 1200L, 0L, 400L)), row.names = c(NA, 20L), class = "data.frame")

我看不到您发布的示例数据,但是,如果我理解得很好,这里是您需要的,都在base R中。如果是这样,可以修改:

# add the timevar you need for reshape:
dats$timev <- with(dats, ave(rep(1, nrow(dats)),  CHOICE_SET, FUN = seq_along))

# now you can reshape it:
dats_w <- reshape(dats, idvar = " CHOICE_SET", timevar = "timev", direction = "wide")

# choose the column you need
dats_w <- dats_w[,c(2,1,3,4,10,6,12,7,13)]

# last add the correct column names
   colnames(dats_w) <- c('INTERVIEW','CHOICE_SET','CHOICE','BRAND_EV','BRAND_ICEV','PRICE_EV','PRICE_ICEV','RANGE_EV',' RANGE_ICEV')

dats_w
   INTERVIEW CHOICE_SET CHOICE BRAND_EV BRAND_ICEV PRICE_EV PRICE_ICEV RANGE_EV  RANGE_ICEV
1        111          1      0        4          1    25000      30000      150        1200
3        111          2      1        1          2    25000      20000      150         800
5        111          3      1        1          4    30000      25000      150         400
7        111          4      0        4          2    20000      15000      350         400
9        111          5      1        2          3    25000      15000      250         400
11       111          6      1        1          2    30000      20000      350        1200
13       111          7      0        3          1    20000      25000      150         800
15       111          8      1        2          3    35000      30000      350         800
17       111          9      0        2          4    20000      15000      250        1200
19       111         10      1        3          1    35000      20000      250         400
#添加重塑所需的时间变量:

dats$timev请阅读有关的信息以及如何给出建议。这将使其他人更容易帮助你。如果可以的话,最好共享一些可用的数据而不是图像,编辑你的问题,添加
dput(head(prova_-reformate,20))
(它将放置类似
结构(…
)的内容,复制它,然后粘贴到编辑它的问题中)。亲爱的@s_t,亲爱的Ronak Shah,非常感谢。我在这里提供数据是为了便于复制。因此,您希望得到的结果是一个数据集,每个INTERTOT只有一行,200列(10列乘20行)亲爱的@s_t,我犯了一个错误,我想要一个每个NSCELTA只有一行的数据集。我对这个错误深表歉意。我查看了第11页。还检查了[link]()中的文件。我希望我的文件与这些示例
结构(列表)中报告的文件相同(采访=111L,选择=1L,选择=0L,品牌=4L,品牌=1L,价格=25000L,价格=30000L,范围=150L,范围=1200L),行名=1L,class=“data.frame”)
亲爱的@s_t,非常感谢。我在上面报告的评论中提供了一个示例,表示我希望如何报告我的新数据。@marcogiansoldat我看到编辑,你只需选择正确的列并重命名它们。亲爱的@s_t,我将在几分钟后尝试与你联系。亲爱的s_t,你是我的英雄。现在,我必须试着在整个数据集上这样做。如果我有问题,你介意我试着给你回复吗?
dats <- structure(list(INTERVIEW = c(111L, 111L, 111L, 111L, 111L, 111L, 
111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 111L, 
111L, 111L, 111L), CHOICE_SET = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 
4L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L), CHOICE = c(0L, 
1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 
1L, 1L, 0L), BRAND = c(4L, 1L, 1L, 2L, 1L, 4L, 4L, 2L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 2L, 4L, 3L, 1L), EV_DUMMY = c(1L, 0L, 
1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 
1L, 0L), PRICE = c(25000L, 30000L, 25000L, 20000L, 30000L, 25000L, 
20000L, 15000L, 25000L, 15000L, 30000L, 20000L, 20000L, 25000L, 
35000L, 30000L, 20000L, 15000L, 35000L, 20000L), RANGE = c(150L, 
1200L, 150L, 800L, 150L, 400L, 350L, 400L, 250L, 400L, 350L, 
1200L, 150L, 800L, 350L, 800L, 250L, 1200L, 250L, 400L), timev = c(1, 
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2)), row.names = c(NA, 
20L), class = "data.frame")