我想了解在将此特定功能应用于我的数据框时我在做错什么。
请求的库是
library(dplyr)
library(magrittr)
library(lubridate)
首先是数据框
t1<-c("2009_01_01 09:00:00","2009_01_01 09:01:00","2009_01_01 09:02:00","2009_01_01 09:03:00","2009_01_01 09:04:00","2009_01_01 09:05:00")
t2<-c("2009_01_01 09:00:00","2009_01_01 09:01:00","2009_01_01 09:02:00")
S1<-cbind("A",t1)
S2<-cbind("B",t2)
datat<-data.frame(rbind(S1,S2))
datat$N<-"NA"
colnames(datat)<-c("trap","time","N")
datat$time<-as.POSIXct(datat$time, "%Y_%m_%d %H:%M:%S",tz="")
listdataset<-split(datat,datat$trap)
trap<-names(listdataset)
listdataset <- lapply(seq_along(listdataset), function(x) as.data.frame(listdataset[[x]]))
names(listdataset)<-trap
list2env(listdataset, envir = .GlobalEnv)
然后开发了特定功能(请注意,该功能是由该社区的成员开发的,可惜我不记得他/她的名字,因此我对未提供正确的功劳表示歉意)对于单个数据帧。我为此目的对其进行了“轻微”修改(原始版本中的i是数据集的名称)。
event_count <- function(ref_time){
min(i %>% filter(time %within% interval(ref_time - 60*5, ref_time)) %>% nrow, 10)
}
我的预期结果是
datat$N<-c(1,2,3,4,5,6,1,2,3)
datat
trap time N
1 A 2009-01-01 09:00:00 1
2 A 2009-01-01 09:01:00 2
3 A 2009-01-01 09:02:00 3
4 A 2009-01-01 09:03:00 4
5 A 2009-01-01 09:04:00 5
6 A 2009-01-01 09:05:00 6
7 B 2009-01-01 09:00:00 1
8 B 2009-01-01 09:01:00 2
9 B 2009-01-01 09:02:00 3
到目前为止,我所能做的没有产生预期的结果。
for (i in listdataset) {
i %<>%
rowwise() %>%
mutate(N = event_count(time)) %>%
arrange(time)
}
i
A tibble: 3 x 3
trap time N
<fct> <dttm> <dbl>
1 B 2009-01-01 09:00:00 1
2 B 2009-01-01 09:01:00 2
3 B 2009-01-01 09:02:00 3
我做错了什么?任何建议将不胜感激! 从我的输出中了解到的是,仅评估了循环的第二个元素。如何也评估第一个要素?
答案 0 :(得分:1)
这可以解决您的问题:
event_count <- function(i,ref_time){
min(i %>% filter(time %within% interval(ref_time - 60*5, ref_time)) %>% nrow, 10)
}
newData <- bind_rows(lapply(listdataset,function(i){i %>%
rowwise() %>%
mutate(N = event_count(i,time)) %>%
arrange(time)}))