R 将数据转换为选择模型数据结构

R 将数据转换为选择模型数据结构,r,R,我在L5num中列出了10种产品,我还有PANID's。我试图为多项式逻辑模型选择一个模型,但我试图首先进行一些数据准备 数据如下所示: PANID WEEK L5num 1669 3174607 2008-09-08 9 21356 3362137 2011-08-01 7 15540 3174607 2010-10-04 9 5869 3150938 2009-07-13 3 18401 3174607 2011-02-28

我在
L5num
中列出了10种产品,我还有PANID's。我试图为多项式逻辑模型选择一个模型,但我试图首先进行一些数据准备

数据如下所示:

        PANID       WEEK L5num
1669  3174607 2008-09-08     9
21356 3362137 2011-08-01     7
15540 3174607 2010-10-04     9
5869  3150938 2009-07-13     3
18401 3174607 2011-02-28     9
10616 3174607 2010-03-22     8
PANID        Product
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        1
3174607        0
…
Next PANID
我正在尝试构建我的数据,以便ID
3174607
选择产品9等。我正在尝试将数据的格式与以下类似:

        PANID       WEEK L5num
1669  3174607 2008-09-08     9
21356 3362137 2011-08-01     7
15540 3174607 2010-10-04     9
5869  3150938 2009-07-13     3
18401 3174607 2011-02-28     9
10616 3174607 2010-03-22     8
PANID        Product
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        0
3174607        1
3174607        0
…
Next PANID
所以这个人买了10种产品中的9种

希望这是有意义的,任何帮助都将不胜感激

编辑:

谢谢你的回复,我真的很感激。我用了你所有的答案,它们都有用。在我原来的帖子中,我确实有一个小小的“补充”。我也希望
重塑我的数据。我的数据有x个变量,我在最初的帖子中没有讨论这些变量

数据看起来像

PANID WEEK  L5num X1 X2 X3 X4...
是否可以应用您建议的方法,同时也包括x变量?因此,输出将与当前建议的相同,但RHS上有x个变量 编辑2:

我用一个“x”变量添加相同的数据


这里有一个使用
表格
数据的选项。表格

library(data.table)
setDT(dat)
n <- dat[, uniqueN(L5num)] # 10
out <- dat[, .(Product = tabulate(L5num, n)), by = PANID]
out #                                    ^ total number of products

我们也可以使用以下基本R方法:

n <- 10 # Number of products
data.frame(PANID = rep(df$PANID, each = n), 
           Product = replace(numeric(n * nrow(df)), 0:(nrow(df) - 1) * n + df$L5num, 1))
#        PANID Product
# 1    3801365       0
# 2    3801365       0
# 3    3801365       0
# 4    3801365       1
# 5    3801365       0
...
其中,对于每个
PANID
,额外变量将重复
n
次。如果有多个变量,则不需要使用
drop=FALSE

使用包-

library(caret)
df$L5num <- as.factor(df$L5num)
dmy <- dummyVars("PANID ~ L5num", data=df)
d <- as.data.frame(predict(dmy, newdata = df))
d$PANID <- rownames(d)
d1 <- melt(d,id.vars="PANID")
d1<-d1[order(d1$PANID),]
d1$variable <- NULL
库(插入符号)

df$L5num使用
tidyverse
可以执行以下操作:

df %>%
 do(data.frame(PANID = rep(.$PANID, each = 10), #Replicating "PANID" and "L5num" 10x
               L5num = rep(.$L5num, each = 10))) %>%
 mutate(temp = gl(length(PANID)/10, 10)) %>% #For all "PANID" values generating an ID
 group_by(temp) %>% #Grouping by ID
 mutate(rowid = seq_along(temp)) %>% #Sequencing around ID to create a row ID
 mutate(Product = ifelse(rowid == L5num, 1, 0)) %>% #Checking whether the row ID is equal to "L5num"
 ungroup() %>%
 select(-rowid,-L5num,-temp) #Removing the redundant variables

     PANID Product
     <int>   <dbl>
 1 3174607      0.
 2 3174607      0.
 3 3174607      0.
 4 3174607      0.
 5 3174607      0.
 6 3174607      0.
 7 3174607      0.
 8 3174607      0.
 9 3174607      1.
10 3174607      0.
11 3362137      0.
12 3362137      0.
13 3362137      0.
14 3362137      0.
15 3362137      0.
16 3362137      0.
17 3362137      1.
18 3362137      0.
19 3362137      0.
20 3362137      0.
df%>%
do(data.frame(PANID=rep(.$PANID,每个=10),#复制“PANID”和“L5num”10x
L5num=rep(.$L5num,每个=10))%>%
对生成ID的所有“PANID”值进行变异(temp=gl(长度(PANID)/10,10))%>%#
分组依据(临时)%>%#分组依据ID
变异(rowid=seq_沿(temp))%>%#围绕ID排序以创建行ID
mutate(Product=ifelse(rowid==L5num,1,0))%>%#检查行ID是否等于“L5num”
解组()%>%
选择(-rowid,-L5num,-temp)#删除冗余变量
聚苯胺产品
1 3174607      0.
2 3174607      0.
3 3174607      0.
4 3174607      0.
5 3174607      0.
6 3174607      0.
7 3174607      0.
8 3174607      0.
9 3174607      1.
10 3174607      0.
11 3362137      0.
12 3362137      0.
13 3362137      0.
14 3362137      0.
15 3362137      0.
16 3362137      0.
17 3362137      1.
18 3362137      0.
19 3362137      0.
20 3362137      0.

如果
数据
是输入数据。则:

library(mlogit)
mlogit.data(Data, choice = "L5num", shape = "wide")

@用户8959427,如果我正确理解了您的更新,我添加了另一行内容,说明如何保留额外的变量。
n <- 10 # Number of products
data.frame(PANID = rep(df$PANID, each = n), 
           Product = replace(numeric(n * nrow(df)), 0:(nrow(df) - 1) * n + df$L5num, 1))
#        PANID Product
# 1    3801365       0
# 2    3801365       0
# 3    3801365       0
# 4    3801365       1
# 5    3801365       0
...
data.frame(PANID = rep(df$PANID, each = n), 
           Product = replace(numeric(n * nrow(df)), 0:(nrow(df) - 1) * n + df$L5num, 1),
           df[rep(1:nrow(df), each = n), -1:-3, drop = FALSE])
#           PANID Product Family.Size
# 13036   3362137       0           2
# 13036.1 3362137       0           2
# 13036.2 3362137       0           2
library(caret)
df$L5num <- as.factor(df$L5num)
dmy <- dummyVars("PANID ~ L5num", data=df)
d <- as.data.frame(predict(dmy, newdata = df))
d$PANID <- rownames(d)
d1 <- melt(d,id.vars="PANID")
d1<-d1[order(d1$PANID),]
d1$variable <- NULL
df %>%
 do(data.frame(PANID = rep(.$PANID, each = 10), #Replicating "PANID" and "L5num" 10x
               L5num = rep(.$L5num, each = 10))) %>%
 mutate(temp = gl(length(PANID)/10, 10)) %>% #For all "PANID" values generating an ID
 group_by(temp) %>% #Grouping by ID
 mutate(rowid = seq_along(temp)) %>% #Sequencing around ID to create a row ID
 mutate(Product = ifelse(rowid == L5num, 1, 0)) %>% #Checking whether the row ID is equal to "L5num"
 ungroup() %>%
 select(-rowid,-L5num,-temp) #Removing the redundant variables

     PANID Product
     <int>   <dbl>
 1 3174607      0.
 2 3174607      0.
 3 3174607      0.
 4 3174607      0.
 5 3174607      0.
 6 3174607      0.
 7 3174607      0.
 8 3174607      0.
 9 3174607      1.
10 3174607      0.
11 3362137      0.
12 3362137      0.
13 3362137      0.
14 3362137      0.
15 3362137      0.
16 3362137      0.
17 3362137      1.
18 3362137      0.
19 3362137      0.
20 3362137      0.
library(mlogit)
mlogit.data(Data, choice = "L5num", shape = "wide")