我正在尝试构建一个名为'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”)
答案 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)
我不太了解你真正需要的东西。 以下是我的两个猜测:
您希望阻止每行插入的代码执行,直到再次满足您的时间条件,这样您就可以执行一些关键代码执行。然后,您需要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
您只需要从当前系统时间开始填充数据框。
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
两个代码片段的输出都是相同的,具体取决于它执行的系统时间。