r - R - 考虑重叠日期查找多行之间的相关性
问题描述
我有一个数据表,其中包含多个雨量计的降雨量测量值。这是我的数据集的示例:
library(data.table)
dat <- fread("https://www.dropbox.com/s/yub3db3739d80h2/dat.csv?dl=1")
> dat
ID date value
1: 937 2000-01-01 14.2
2: 937 2000-01-02 68.3
3: 937 2000-01-03 28.4
4: 937 2000-01-04 30.2
5: 937 2000-01-05 12.8
---
33905: 1600 2017-06-12 0.1
33906: 1600 2017-06-13 36.1
33907: 1600 2017-06-14 0.3
33908: 1600 2017-06-15 0.0
33909: 1600 2017-06-16 0.0
我还有一个数据表,其中包含每个仪表的 ID 以及最近的几个仪表的 ID,以及它们具有降雨测量的常见日期:
neighbors <- fread("https://www.dropbox.com/s/phhskbhxsxmrxy1/neighbours.csv?dl=1")
> neighbors
ID ID_nearest common_date_begin common_date_end diff_days
1: 1 1117 2000-03-01 2006-12-03 2468
2: 1 920 2000-03-01 2004-11-04 1709
3: 1000 48 2000-03-01 2006-12-03 2468
4: 1000 1600 2000-03-01 2017-06-16 6316
5: 1000 937 2000-03-01 2017-01-22 6171
6: 1001 352 2007-07-10 2017-06-16 3629
7: 1001 324 2007-07-10 2017-06-16 3629
8: 1002 1338 2006-01-01 2017-06-16 4184
9: 1002 412 2006-01-01 2009-07-12 1288
10: 1002 1330 2006-01-01 2017-06-16 4184
11: 1002 1349 2006-01-01 2017-06-16 4184
12: 1009 801 2006-01-01 2017-01-22 4039
例如,仪表 ID1
有两个近邻:ID1117
和920
。1
台站的重叠测量期为1117
2000 年 3 月 1 日至 2006 年 12 月 3 日。
对于像这样的每个组合neighbors
,我需要计算重叠日期内主要和周围仪表之间的降雨测量值的相关性。
例如,第一对的相关性可以这样计算:
cor(dat[ID==1 & date %between% c("2000-03-01", "2006-12-03")]$value,
dat[ID==1117 & date %between% c("2000-03-01", "2006-12-03")]$value)
cor(dat[ID==1 & date %between% c("2000-03-01", "2004-11-04")]$value,
dat[ID==920 & date %between% c("2000-03-01", "2004-11-04")]$value)
预期的输出将是这样的:
ID ID_nearest correlation n
1 1117 0.55 2468
1 920 0.48 1709
1000 48 0.77 2468
1000 1600 0.52 6316
1000 937 0.84 6171
等等。ID
_neighbors
但是我很难想出一种程序化的方式来实现这一点。
我怎样才能做到这一点?提前致谢。
解决方案
这是一种方法
> df <- do.call(rbind, lapply(unique(neighbors$ID), function(id) {
d <- neighbors[neighbors[, "ID"] %in% id, ]
main.vals <- dat %>%
dplyr::filter(ID == id & (date >= d$common_date_begin & date <= max(d$common_date_end))) %>%
dplyr::select(value)
main.vals <- main.vals$value
nearest.vals <- lapply(unique(d$ID_nearest), function(neigh.id) {
r <- d[d$ID_nearest== neigh.id, ]
vals <- dat[dat$ID == neigh.id & (dat$date >= r$common_date_begin & dat$date <= r$common_date_end), ]
return (vals$value)
})
d <- d %>%
dplyr::select(-c(common_date_begin, common_date_end)) %>%
dplyr::mutate(correlation = sapply(nearest.vals, cor, y = main.vals),
n = diff_days)
return(d)
}))
> df
# ID ID_nearest diff_days correlation n
# 1 1 1117 2468 0.527024 2468
# 2 1 920 1709 -0.469635 1709
我们循环遍历ID
邻居数据中的每个唯一值,从dat
date.frame 中过滤掉它的值,随后过滤掉 data.frame 中每个邻居的值neighbors
,并检查对应于主 id 的降雨量与每个邻居编号。
我使用了以下数据(修改为将ID_nearest
值添加到dat
):
library(dplyr)
library(magrittr)
dat <- read.table(text = "
1 2000-03-01 55.3
1 2000-03-02 55.6
1 2005-03-03 48.3
920 2000-03-01 14.2
920 2000-04-02 68.3
920 2000-04-03 68.4
1117 2003-03-01 0.1
1117 2003-06-13 36.1
1117 2003-06-14 0.3
", col.names = c("ID", "date", "value"))
dat$date <- as.POSIXct(dat$date)
neighbors <- read.table(text = "
ID ID_nearest common_date_begin common_date_end diff_days
1 1117 2000-03-01 2006-12-03 2468
1 920 2000-03-01 2004-11-04 1709
", header = TRUE)
neighbors$common_date_begin <- as.POSIXct(neighbors$common_date_begin)
neighbors$common_date_end <- as.POSIXct(neighbors$common_date_end)
推荐阅读
- database - 在数据库级别实现“系统用户”的最佳方式(如最佳实践)是什么?
- python - Python @property setter 中的约束未应用
- java - 在一个 JFrame 中打包三个 JPanel
- php - 使用 PHP 或 WordPress 转义 JSON 字符串中的 html 数据
- java - 访问 Spring JdbcTemplate 实例时出现 NullPointerException
- python - 避免多维数组中的for循环
- php - 在 Wordpress 仪表板中添加我的自定义帖子类型作为其自己的菜单项
- cakeyframeanimation - 如何获取 CAKeyframeAnimation 对象的当前屏幕 xy 位置?
- mysql - MySQL复制卡住了
- java - 要么无法在 Android Studio 中安装或导入 Volley