我有一个数据框,其中包含有关许多卖家ID的信息以及他们卖出的期限。如果他们没有在接下来的6个阶段进行抛售,我想创建一个名为“非活跃”的新列。基于R中的多个列条件有效指定新的列值
这里是一个样本数据集的dput:
structure(list(SellerID = c(1, 7, 4, 3, 1, 7, 4, 2, 5, 1, 2,
5, 7), Period = c(1, 1, 1, 2, 2, 3, 3, 5, 5, 9, 9, 10, 10)), .Names = c("SellerID",
"Period"), row.names = c(NA, -13L), class = "data.frame")
这里是我的理想结果的dput(第5行有1的无效,因为该行,sellerID 1在时期2中做了销售, 。但他接下来的销售是在周期9排10]因此,他是不活动的至少6个周期,因此,我们要记录,为了预测当卖方将处于非活动状态):
structure(list(SellerID = c(1, 7, 4, 3, 1, 7, 4, 2, 5, 1, 2,
5, 7), Period = c(1, 1, 1, 2, 2, 3, 3, 5, 5, 9, 9, 10, 10), Inactive = c(0,
0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0)), .Names = c("SellerID",
"Period", "Inactive"), row.names = c(NA, -13L), class = "data.frame")
我尝试使用nest-for循环方法解决这个问题,但是我的数据集非常大,并且需要很长的时间需要运行的时间(大约200,000行)。我也在示例数据集上尝试过我的方法,但似乎无效。这里是我下面的方法:
full.df$Inactive <- NA
for (i in 1:nrow(full.df)){
temp = subset(full.df, SellerID = unique(full.df$SellerID[i]))
for(j in 1:(nrow(temp) -1)){
if(temp$Period[j+1] - temp$Period[j] <6)
temp$Inactive[j] <-0
else
temp$Inactive[j] <-1
}
full.df[rownames(full.df) %in% rownames(temp), ]$Inactive <- temp$Inactive
}
从虚拟数据集的输出,用我的方法把一个0在“无效”的所有行除最后一行NA。下面是我得到的输出dput:
structure(list(SellerID = c(1, 7, 4, 3, 1, 7, 4, 2, 5, 1, 2,
5, 7), Period = c(1, 1, 1, 2, 2, 3, 3, 5, 5, 9, 9, 10, 10), Inactive = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA)), .Names = c("SellerID",
"Period", "Inactive"), row.names = c(NA, -13L), class = "data.frame")
使用'dput'来分享样本数据,并试图解决这个问题。 –
我编辑了我的帖子来描述我解决这个问题的尝试。不幸的是,我不能共享样本数据,因为数据很敏感,我已经签署了保密合同。 –
你可以创建一个虚拟样本数据并解释你的问题,因为我仍然失去了逻辑。 –