遍历DataTable为每个ID建立模型

时间:2019-03-30 15:27:49

标签: r loops

我有一个看起来像这样的数据表:

ID   Weeks  V1   V2   Sales
1      1    100  200    30
1      2    100  210    40
1      3    102  240    50
2      1    120  220    35
3      1    110  202    51
...

我的目标是预测每个ID在第9周的销售额。大多数ID填充了第1-8周的值,其他ID仅包含一个值。这基本上是我想要的每个ID,而不仅仅是ID 26:

train_ID26 = train[ID==26,]
test_ID26 = test[ID==26,]
model_ID26 = glm(Sales~ V1+V2,data = train_ID26)
test_ID26[,pred:= predict(model_ID26, newdata=test_ID26, type="response")]

我认为可以使用for循环来完成此操作,但是不幸的是,我对R中的代码并不熟悉,也无法找出要构建的一个。我还读到循环通常不是R中的首选。

2 个答案:

答案 0 :(得分:2)

在训练和测试数据集上都考虑split,然后使用Map(包装到mapply)调用预测以进行元素迭代。下面假设两个数据表中的唯一ID数相同。

# LIST OF DATA TABLES
train_list = data.table::split(train, by="ID")
test_list = data.table::split(test, by="ID")

# GENERALIZED PREDICTION FUNCTION
proc_model <- function(test_ID, train_ID) {
   model_ID <- glm(Sales~ V1+V2, data=train_ID)
   test_ID[,pred:= predict(model_ID, newdata=test_ID, type="response")]
}

# LIST OF PREDICTED DATA TABLES
pred_list <- Map(proc_model, train_list, test_list)

答案 1 :(得分:0)

如果您不怕for loop解决方案:

train_ID<- list()
test_ID <- list()
model_Id <- list()
for(id in train$ID){
  train_ID[[paste0("ID",id)]]=train[ID==id,]
  test_ID[[paste0("ID",id)]]=test[ID==id,]
  model_ID[[paste0("ID",id)]] = glm(Sales~ V1+V2,data = train_ID[[paste0("ID",id)]])
  test_ID[[paste0("ID",id)]]=test_id[[paste0("ID",id)]][,pred:= predict(model_ID[[paste0("ID",id)]], newdata= test_ID[[paste0("ID",id)]], type="response")]
}