建立一个以时间为条件的数据框
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
追加每个新行
我不太明白你真正需要的是什么。
这是我的两个猜测:
您想在每次插入行时阻止代码执行,直到再次满足您的时间标准,这样您就可以执行一些时间关键的代码。然后你需要 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
两个代码片段的输出是相同的,具体取决于它执行的系统时间。
我正在尝试构建一个名为 '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
我不太明白你真正需要的是什么。 这是我的两个猜测:
您想在每次插入行时阻止代码执行,直到再次满足您的时间标准,这样您就可以执行一些时间关键的代码。然后你需要
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
两个代码片段的输出是相同的,具体取决于它执行的系统时间。