代码之家  ›  专栏  ›  技术社区  ›  anitasp

构建以时间为条件的数据帧

  •  0
  • anitasp  · 技术社区  · 7 年前

    我正在尝试构建一个名为“df”的数据帧,它在输入每一行时记录时间戳“df”应具有唯一列:

    str(a$textid)
    

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

    str(a)
    

    '数据。帧:262 obs,共3个变量: $V1:chr“referenos alguien que compre o arriende,si concreta obtn un ingreso extra\n\ngoo.gl/OlPYuZ”“Menciona a un amigo que quiera compar una propiedad,si concreta,consigue dinero plus\n\ngoo.gl/OlPYuZ”“referenos alguien que compre o arriende,si concreta obtn un ingreso extra\n\ngoo.gl/OlPYuZ”“Menciona a un amigo que quiera compar una propiedad,si concreta,consigue dinero plus\n\ngoo.gl/OlPYuZ”。。。 $limit:logi FALSE FALSE FALSE FALSE FALSE。。。

    dput(droplevels(head(a)))
    

    结构(列表(V1=c(“referenos alguien que compre o arriende,si concreta obtn un ingreso extra\n\ngoo.gl/OlPYuZ”, “Menciona a un amigo que quiera compar una propiedad,si concreta,consigue dinero plus\n\ngoo.gl/OlPYuZ”, “referenos alguien que compre o arriende,si concreta obtn un ingreso extra\n\ngoo.gl/OlPYuZ”, “referenos alguien que compre o arriende,si concreta obtn un ingreso extra\n\ngoo.gl/OlPYuZ”, “Menciona a un amigo que quiera compar una propiedad,si concreta,consigue dinero plus\n\n goo.gl/OlPYuZ” ),textid=c(“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy”,“xxxxx yyy” ),limit=c(FALSE,FALSE,FALSE,FALSE,FALSE),name=c(“V1”, “textid”,“limit”),第行。名称=c(NA,6L),class=“数据帧”)

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

    为此,我构建了以下代码:

    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
            }
        }
    }
    

    str(df)
    

    '数据。帧:1个变量的2982 obs

    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
    }
    

    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”的行在输入“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”

    正如你所看到的,每一行的时间都是一样的。我想得到的是:

    结构(列表( c(不适用) =c(“2017-07-11 16:30:46 xxxx yyyy”, “2017-07-11 16:31:51 xxxxx yyy”, “2017-07-11 16:33:33 xxxxx yyy”, “2017-07-11 16:36:28 xxxxx yyy” )),.Names=“c(NA)”,第行。名称=c(NA,6L),class=“数据帧”)

    2 回复  |  直到 7 年前
        1
  •  1
  •   Dunkelkoon    7 年前

    我不太明白你真正需要什么。 以下是我的两个猜测:

    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
      

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

        2
  •  1
  •   Damian    7 年前

    删除对的调用 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