对于R中的循环分配给数据帧

时间:2014-02-14 02:45:10

标签: r for-loop

运行for循环后,我无法分配数据帧。当我使用打印时,它给出了我的价值,给它任何解释吗?

 salesdate<-rep(seq(from=as.Date("2013-12-19"),to=as.Date("2013-12-23"),by=1),100)
 memberid<-as.factor(sample(1:1000,500))
 msales<-data.frame(salesdate,memberid)

 new<-seq(from=as.Date("2013-12-19"),to=as.Date("2013-12-23"),by=1)
 for(i in new) 
+   print(length(unique(msales[(msales$salesdate>="2013-12-23" | msales$salesdate>=i),]$memberid)))
[1] 500
[1] 400
[1] 300
[1] 200
[1] 100

 test <- rep(NA,length(new))
 new<-seq(from=as.Date("2013-12-19"),to=as.Date("2013-12-23"),by=1)
 for(i in new) 
+   test[1:5]<-length(unique(msales[(msales$salesdate>="2013-12-23" | msales$salesdate>=i),]$memberid))
> test
[1] 100 100 100 100 100

我创建了一些样本。我的目标是从当前日期开始计算每个日期的唯一ID数。感谢指导,伙计们。

1 个答案:

答案 0 :(得分:2)

我不是百分之百确定你要做什么,但我主要的问题是你在每次循环迭代时分配给[1:5],这意味着到最后你将获得最终结果分配给所有五个的值(100),因为在最后一次迭代(以及每隔一次)中,您将分配给所有五个点([1:5])。这是另一种选择:

test <- rep(NA,length(new))
for(i in seq_along(new)) 
  test[i]<-length(
    unique(
      msales[(msales$salesdate>="2013-12-23" | msales$salesdate>=new[[i]]),]$memberid
  ) )  
test

关键部分是test[i] <- ...。这会产生:

# [1] 500 400 300 200 100`

另请注意我们需要如何使用msales$salesdate >= new[[i]]