在某些区域(名称),各种观察点( obs )都会观察到鸟类。 开始和结束时间已经过去,并且时间差( diff_corr )会使用修正系数重新计算,因此它不仅仅是{{1开始结束间隔。
我现在需要"拆分"这些价值观对于#34;不错"间隔(15分钟,例如10:15:00,10:30:00,......)然后按区域聚合(名称)以便能够制作出现的情节这些地区的鸟类只需15分钟的间隔。
所以,为了让它更清晰一点:观察可能会在10:14开始直到10:25,所以它跨越10:00-10:15和10:15-10:30的间隔,所以我得到的价值应该被拆分,并按照它们进入该区间的部分相应地分配给它。
在更复杂的设置中,观察可能跨越3或4个间隔,因此值也必须相应地分开。
最后一步是每个区间聚集所有观察部分并绘制它们。
我已经搜索了几天的解决方案,但只发现了非常简单的示例,其中间隔是使用difftime
和cut
重新排列的,但从不说明如何处理相关值,而是简单的频率计数。
示例数据:
breaks
P.S。我很难正确地指出我的问题,所以任何提示(不仅仅是那个)都受到高度赞赏
一个小例子的新尝试: 按比例将值分配给间隔(稍后总计相等的间隔)
structure(list(obs = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("b",
"C2", "Dürnberg2"), class = "factor"), name = c("C2", "C2",
"C2", "C2", "C2", "C2", "C2", "C2", "C2", "b", "981", "1627",
"b", "b", "981", "1627", "b", "b", "b", "b"), start = structure(c(1495441500,
1495441590, 1495441650, 1495441680, 1495447380, 1495447410, 1495447530,
1495447560, 1495447580, 1496996580, 1496996580, 1496996580, 1496996760,
1496996820, 1496996820, 1496996820, 1496997180, 1496997300, 1496997420,
1496998260), class = c("POSIXct", "POSIXt"), tzone = ""), end = structure(c(1495441590,
1495441650, 1495441680, 1495441800, 1495447410, 1495447530, 1495447560,
1495447580, 1495447620, 1496996760, 1496996760, 1496996760, 1496996820,
1496997180, 1496997180, 1496997180, 1496997300, 1496997420, 1496997540,
1496998320), class = c("POSIXct", "POSIXt"), tzone = ""), diff_corr = c(1.46739130434783,
0.978260869565217, 0.489130434782609, 1.95652173913043, 0.489130434782609,
1.95652173913043, 0.489130434782609, 0.326086956521739, 0.652173913043478,
2.96703296703297, 2.96703296703297, 2.96703296703297, 0.989010989010989,
5.93406593406593, 5.93406593406593, 5.93406593406593, 1.97802197802198,
1.97802197802198, 1.97802197802198, 0.989010989010989)), .Names = c("obs",
"name", "start", "end", "diff_corr"), row.names = c("1", "9",
"7", "8", "3", "2", "4", "5", "6", "13", "13.1", "13.2", "22",
"11", "11.1", "11.2", "12", "23", "15", "16"), class = "data.frame")
答案 0 :(得分:1)
这很慢而且很笨重,但也许它很有帮助。按名称和15分钟间隔计算计数和加权diff_corr总和:
library(dplyr)
range <- seq.POSIXt(min(df$start)-(15*60), max(df$end)+(15*60), by = "15 min")
df$totalDuration <- as.numeric(as.difftime(df$end-df$start),units=c("secs"))
out <- NULL
for (r in 1:length(range)){
subset <- df %>% filter( (start >= (range[r]-(15*60)) & start<range[r]) |
(end>= (range[r]-(15*60)) & end<range[r] ) |
(end > range[r] & start < range[r])) %>%
mutate(bin=range[r],
duration = ifelse(start>=(range[r]-(15*60)) & end<range[r],totalDuration,
ifelse(start>=(range[r]-(15*60)),as.numeric(as.difftime(range[r]-start),units="secs"),
ifelse(end<range[r],
as.numeric(as.difftime(end-(range[r]-(15*60))),units="secs"),
as.numeric(as.difftime(range[r]-(range[r]-(15*60))),units="secs")
)))
) %>%
mutate (diff_corr_W = diff_corr*(duration/as.double(totalDuration, units='secs'))) %>%
group_by(bin,name) %>% summarise(count=n(),
diff_corr_sum = sum(diff_corr_W)) %>% ungroup()
if (is.null(out)){
out <- subset
} else {
out <- rbind(out,subset)
}
}
> out
# A tibble: 9 x 4
bin name count diff_corr_sum
* <dttm> <chr> <int> <dbl>
1 2017-05-22 04:40:00 C2 4 4.891304
2 2017-05-22 06:10:00 C2 5 3.913043
3 2017-06-09 04:25:00 1627 1 1.978022
4 2017-06-09 04:25:00 981 1 1.978022
5 2017-06-09 04:25:00 b 1 1.978022
6 2017-06-09 04:40:00 1627 2 6.923077
7 2017-06-09 04:40:00 981 2 6.923077
8 2017-06-09 04:40:00 b 6 13.846154
9 2017-06-09 04:55:00 b 1 0.989011
答案 1 :(得分:1)
这是一种Intent mainIntent = getActivity().getIntent();
mainIntent.putExtra(Constants.TICKET_DONT_SHOW_QRCODE_SCREEN, true);
getActivity().setIntent(mainIntent);
方法,允许您使用SQL类型查询对数据进行排序/过滤并执行操作。
数据强>
data.table
<强> CODE 强>
> p
obs name start end diff_corr
1: C2 C2 2017-05-22 04:25:00 2017-05-22 04:26:30 1.4673913
2: C2 C2 2017-05-22 04:26:30 2017-05-22 04:27:30 0.9782609
3: C2 C2 2017-05-22 04:27:30 2017-05-22 04:28:00 0.4891304
4: C2 C2 2017-05-22 04:28:00 2017-05-22 04:30:00 1.9565217
5: C2 C2 2017-05-22 06:03:00 2017-05-22 06:03:30 0.4891304
6: C2 C2 2017-05-22 06:03:30 2017-05-22 06:05:30 1.9565217
7: C2 C2 2017-05-22 06:05:30 2017-05-22 06:06:00 0.4891304
8: C2 C2 2017-05-22 06:06:00 2017-05-22 06:06:20 0.3260870
9: C2 C2 2017-05-22 06:06:20 2017-05-22 06:07:00 0.6521739
10: b b 2017-06-09 04:23:00 2017-06-09 04:26:00 2.9670330
11: b 981 2017-06-09 04:23:00 2017-06-09 04:26:00 2.9670330
12: b 1627 2017-06-09 04:23:00 2017-06-09 04:26:00 2.9670330
13: b b 2017-06-09 04:26:00 2017-06-09 04:27:00 0.9890110
14: b b 2017-06-09 04:27:00 2017-06-09 04:33:00 5.9340659
15: b 981 2017-06-09 04:27:00 2017-06-09 04:33:00 5.9340659
16: b 1627 2017-06-09 04:27:00 2017-06-09 04:33:00 5.9340659
17: b b 2017-06-09 04:33:00 2017-06-09 04:35:00 1.9780220
18: b b 2017-06-09 04:35:00 2017-06-09 04:37:00 1.9780220
19: b b 2017-06-09 04:37:00 2017-06-09 04:39:00 1.9780220
20: b b 2017-06-09 04:51:00 2017-06-09 04:52:00 0.9890110
<强>输出强>
library(data.table)
library(lubridate)
p <- as.data.table(p)
p[, .(new_diff = mean(diff_corr)), .(tme_start = round_date(start, unit = "15min"))]
Data.Table在做什么?
由于您不熟悉> p[, .(new_diff = mean(diff_corr)), .(tme_start = round_date(start, unit = "15min"))]
tme_start new_diff
1: 2017-05-22 04:30:00 1.2228261
2: 2017-05-22 06:00:00 0.7826087
3: 2017-06-09 04:30:00 3.3626374
4: 2017-06-09 04:45:00 0.9890110
,这里有一个非常快速,基本的描述正在发生的事情。 data.table
来电的一般形式是:
data.table
其中DT[select rows, perform operations, group by]
是DT
名称。 data.table
是一个逻辑操作,例如假设您只想观察C2(名称),则调用将是Select rows
无需执行任何操作且无需分组。如果您希望所有DT[name == "C2",]
的{{1}}列总和,则呼叫将变为diff_corr
。您可以使用name == "C2"
而不是撰写DT[name == "C2", list(sum(diff_corr))]
。输出现在只有一行和一列list()
,它是.()
时所有V1
的总和。该列没有很多信息,因此我们为其指定一个名称(可以与旧名称相同):diff_corr
。假设你有另一个名为“情绪”的专栏,它报告了观察者的情绪并且可以假设三个值(“快乐”,“悲伤”,“困”)。你可以“分组”心情:name == "C2"
。输出将是对应于每个情绪的三行和一列DT[name == "C2", .(diff_corr_sum = sum(diff_corr))]
。要更好地理解这一点,请尝试使用像DT[name == "C2", .(diff_corr_new = sum(diff_corr)), by = .(mood)]
这样的示例数据集。您的示例数据没有足够的复杂性等,以便您可以探索所有这些功能。
回到答案 - 其他变体
如果您想根据diff_corr_new
或mtcars
进行舍入,则问题或评论中不清楚。我使用前者,但你可以改变它。上面的示例使用start
,但您可以执行您可能需要的任何其他操作。其他列似乎或多或少是多余的,因为它们是字符串,你不能用它们做太多。您可以使用它们对end
条目(代码中的最后一个字段)中的结果进行进一步排序。以下是分别使用mean
和by
的两个示例。您也可以将所有这些组合在一起。
obs