建立一个以时间为条件的数据框

Build a dataframe conditioned to time

我正在尝试构建一个名为 'df' 的数据框,用于记录输入每一行时的时间戳。 'df' 应该有一个唯一的列:

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

str(a$textid)

chr [1:262] "xxxxx yyy" ...

'a' 组成为:

str(a)

'data.frame': 262 obs. of 3 variables: $ V1 : chr "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: chr "xxxxx yyyy" ... $ limit : logi FALSE FALSE FALSE FALSE FALSE FALSE ...

dput(droplevels(head(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")

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

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. of 1 variable: $ 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
  }
}

但是 'a's' 行保持同时进入 'df' 并且在进入每一行之前不循环寻找下一个时间匹配的条件。

dput(droplevels(head(df)))

structure(list(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" )), .Names = "c(NA)", row.names = c(NA, 6L), class = "data.frame")

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

structure(list(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" )), .Names = "c(NA)", row.names = c(NA, 6L), class = "data.frame")

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

删除对 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. 您想在每次插入行时阻止代码执行,直到再次满足您的时间标准,这样您就可以执行一些时间关键的代码。然后你需要 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
    

两个代码片段的输出是相同的,具体取决于它执行的系统时间。