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
我正在尝试构建我的数据,以便ID3174607
选择产品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")