构建一个时间

时间:2017-07-10 21:23:01

标签: r loops time-complexity systemtime

我正在尝试构建一个名为'df'的数据框,该数据框在输入每一行时注册时间戳。 'df'应该有一个独特的列:

我想在'df'中输入的数据来自数据框'a',列'textid':

str(a$textid)
  

chr [1:262]“xxxxx yyy”......

'a'的组成为:

str(a)
  

'data.frame':262 obs。 3个变量:    $ V1:chr“Refierenos alguien que compre o arriende,siconcretaobténuningreso extra \ n \ ngoo.gl/OlPYuZ”“Menciona a un amigo que quiera comprar una propiedad,si concreta,consigue dinero plus \ n \ ngoo.gl / OlPYuZ“”Refierenos alguien que compre o arriende,siconcretaobténuningreso extra \ n \ ngoo.gl/OlPYuZ“”Menciona a un amigo que quiera comprar una propiedad,si concreta,consigue dinero plus \ n \ ngoo.gl/ OlPYuZ“......    $ textid:chr“xxxxx yyyy”......    $ limit:logi FALSE FALSE FALSE FALSE FALSE ...

dput(droplevels(head(a)))
  

结构(列表(V1 = c(“Refierenos alguien que compre o arriende,siconcretaobténuningreso extra \ n \ ngoo.gl/OlPYuZ”,   “Menciona a un amigo que quiera comprar una propiedad,si concreta,consigue dinero plus \ n \ ngoo.gl/OlPYuZ”,   “Refierenos alguien que compre o arriende,siconcretaobténuningreso extra \ n \ ngoo.gl/OlPYuZ”,   “Menciona a un amigo que quiera comprar una propiedad,si concreta,consigue dinero plus \ n \ ngoo.gl/OlPYuZ”,   “Refierenos alguien que compre o arriende,siconcretaobténuningreso extra \ n \ ngoo.gl/OlPYuZ”,   “Menciona a un amigo que quiera comprar una propiedad,si concreta,consigue dinero plus \ n \ ngoo.gl/OlPYuZ”   ),textid = c(“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”   ),limit = c(FALSE,FALSE,FALSE,FALSE,FALSE,FALSE)),. Name = c(“V1”,   “textid”,“limit”),row.names = c(NA,6L),class =“data.frame”)

我需要时间条件。如果出现以下情况,则必须输入每一行:

if(as.integer(Sys.time()) %% 11 & as.integer(Sys.time()) %% 17 != 0)

在输入行之后,应该有一个循环,它应该等待下一次Sys.Time()(强制为整数值)与该条件匹配。

为此,我已经构建了这段代码:

df <- c(NA)
df <- as.data.frame(matrix(c(a), nrow = nrow(a)))


i=1

while(i <= nrow(a)) {
    repeat {
        if (as.integer(Sys.time()) %% 11 & as.integer(Sys.time()) %% 17 != 0) {
            break
        } else {
            df[i,]<- paste(Sys.time(),a$textid[i])
            i=i+1
        }
    }
}

不成功我用相同的时间戳同时获得al df的行。

str(df)
  

'data.frame':2982 obs。 1个变量:    $ c(NA):chr“2017-07-10 13:14:58 xxxxx yyy”......

然后我尝试了

i=1 
while(i<=nrow(ids) & as.integer(Sys.time()) %% 11 == 0 & as.integer(Sys.time()) %% 17 == 0) {
    df[i,]<-paste(Sys.time(),a$textid[i]) 
    i=1+i
}

但我得到一个空的'df'。

我正在尝试:

i=1
df<-as.data.frame(c(NA))
repeat{
    if(as.integer(Sys.time()) %% 11 & as.integer(Sys.time()) %% 17 == 0{
        df[i,]<-paste(Sys.time(),a$textid[i])
        i=1+i
    }
  if(i>nrow(ids)){
    break
  }
}

但''''行继续同时进入'df',并且在进入每一行之前不会循环寻找匹配的下一个条件。

dput(droplevels(head(df)))
  

结构(列表(c(NA) = c(“2017-07-11 16:30:46 xxxx yyyy”,   “2017-07-11 16:30:46 xxxxx yyy”,   “2017-07-11 16:30:46 xxxxx yyy”,   “2017-07-11 16:30:46 xxxxx yyy”,   “2017-07-11 16:30:46 xxxxx yyy”,   “2017-07-11 16:30:46 xxxxx yyy”   )),。Name =“c(NA)”,row.names = c(NA,6L),class =“data.frame”)

正如您所看到的,每一行的时间都相同。我想要得到的是:

  

结构(列表(c(NA) = c(“2017-07-11 16:30:46 xxxx yyyy”,   “2017-07-11 16:31:12 xxxxx yyy”,   “2017-07-11 16:31:51 xxxxx yyy”,   “2017-07-11 16:33:33 xxxxx yyy”,   “2017-07-11 16:33:35 xxxxx yyy”,   “2017-07-11 16:36:28 xxxxx yyy”   )),。Name =“c(NA)”,row.names = c(NA,6L),class =“data.frame”)

2 个答案:

答案 0 :(得分:1)

我认为主要问题是速度。循环执行得足够快,可以在一个一秒的时间间隔内遍历每一行,然后挂起,直到触发中断条件。因此,时间戳是相同的。

删除对Sys.sleep的调用以重新创建问题(相同的时间戳)

a <- data.frame(V1 = c("Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", 
                        "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ", 
                        "Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", 
                        "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ", 
                        "Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", 
                        "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ" ), 
                textid = c("xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy" ), 
                limit = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE),
                stringsAsFactors = FALSE)
str(a)

df <- NULL
i <- 1

repeat {
    t <- Sys.time()

    if ( as.integer(t) %% 11 & as.integer(t) %% 17 == 0 ) {

        new_row <- a[i, ]
        new_row$id <- paste(t, a$textid[i])

        if ( is.null(df) ) {
            df <- new_row
        } else {
            df <- rbind(df, new_row)
        }

        i <- 1+i

        # Force a pause. Without this the times are all the same
        Sys.sleep(1) 
    }

    if( i > nrow(a) ) break
}

df[, c("id", "textid", "limit")]

结果

                             id    textid limit
1 2017-07-12 19:49:30 xxxxx yyy xxxxx yyy FALSE
2 2017-07-12 19:49:47 xxxxx yyy xxxxx yyy FALSE
3 2017-07-12 19:50:04 xxxxx yyy xxxxx yyy FALSE
4 2017-07-12 19:50:21 xxxxx yyy xxxxx yyy FALSE
5 2017-07-12 19:50:55 xxxxx yyy xxxxx yyy FALSE
6 2017-07-12 19:51:12 xxxxx yyy xxxxx yyy FALSE

要解决其他问题(数据框中没有行df),我会使用rbind附加每一行

答案 1 :(得分:1)

我不太了解你真正需要的东西。 以下是我的两个猜测:

  1. 您希望阻止每行插入的代码执行,直到再次满足您的时间条件,这样您就可以执行一些关键代码执行。然后,您需要Sys.sleep()来暂停代码执行。

    a <- structure(list(V1 = c("Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ", "Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ", "Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ" ), textid = c("xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy" ), limit = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)), .Names = c("V1", "textid", "limit"), row.names = c(NA, 6L), class = "data.frame")
    
    #Using your example code:
    df <- data.frame(V1 = rep(NA, nrow(a)))
    i <- 1
    while(i <= nrow(a)) {
        if (as.integer(Sys.time()) %% 11 & as.integer(Sys.time()) %% 17 != 0) {
            #Sleep to reduce CPU occupation.
            Sys.sleep(0.5)
        } else {
            df[i,]<- paste(Sys.time(),a$textid[i])
            ###############################
            # Do something time critical. #
            ###############################
            i <- i + 1
            #Blocking for 1 second, thus as.integer(Sys.time()) will
            #be garantied to be different.
            Sys.sleep(1)
        }
    }
    
    df
    #                             V1
    #1 2017-07-13 02:43:48 xxxxx yyy
    #2 2017-07-13 02:43:54 xxxxx yyy
    #3 2017-07-13 02:43:59 xxxxx yyy
    #4 2017-07-13 02:44:10 xxxxx yyy
    #5 2017-07-13 02:44:11 xxxxx yyy
    #6 2017-07-13 02:44:21 xxxxx yyy
    
  2. 您只需要从当前系统时间开始填充数据框。

    a <- structure(list(V1 = c("Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ", "Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ", "Refierenos alguien que compre o arriende, si concreta obtén un ingreso extra \n\ngoo.gl/OlPYuZ", "Menciona a un amigo que quiera comprar una propiedad, si concreta, consigue dinero plus\n\ngoo.gl/OlPYuZ" ), textid = c("xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy", "xxxxx yyy" ), limit = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)), .Names = c("V1", "textid", "limit"), row.names = c(NA, 6L), class = "data.frame")
    
    #Using your example code:
    df <- data.frame(V1 = rep(NA, nrow(a)))
    i <- 1
    t <- Sys.time()
    while(i <= nrow(a)) {
        if (!(as.integer(t) %% 11 & as.integer(t) %% 17 != 0)) {
            df[i,]<- paste(t,a$textid[i])
            i <- i + 1
        }
        t <- t + 1
    }
    
    df
    #                             V1
    #1 2017-07-13 02:43:48 xxxxx yyy
    #2 2017-07-13 02:43:54 xxxxx yyy
    #3 2017-07-13 02:43:59 xxxxx yyy
    #4 2017-07-13 02:44:10 xxxxx yyy
    #5 2017-07-13 02:44:11 xxxxx yyy
    #6 2017-07-13 02:44:21 xxxxx yyy
    
  3. 两个代码片段的输出都是相同的,具体取决于它执行的系统时间。