首页 > 解决方案 > 如何提取一起变化的变量?

问题描述

我有一个共享相同日期的变量的data.frame。现在,在对计数数据执行泊松之后,我想确定提取满足此条件的变量的最佳方法:

对于共享日期的变量,哪些变量的值发生变化?

请参阅下面的可重复环境(代码部分)

我最接近的是通过“Obs.date”变量过滤数据,但鉴于数据长度为 7000 obs,我想知道是否有可能做到这一点......更有效。

#Recreate data environment
set.seed(9999)
locations<-sample(LETTERS,20,replace = T)
startdate<-seq(as.Date('2018/01/01'), as.Date('2018/12/31'), by="day")
locations<-paste0('Location ', locations)
dat<-data.frame(
  Obs.date = sample(startdate,7000,replace = T),
  Obs.count = sample(0:6,7000,replace = T),
  Obs.loc = sample(locations,7000,replace = T),
  stringsAsFactors = F)

dfList<-split(dat,dat$Obs.loc)
a <- Reduce(function(x, y) merge(x, y, all = TRUE), dfList)
b <- a[duplicated(a$Obs.date), ]

> head(b)
    Obs.date Obs.count    Obs.loc
2 2018-01-01         1 Location U
3 2018-01-01         1 Location Y
4 2018-01-01         2 Location D
5 2018-01-01         2 Location E
6 2018-01-01         2 Location F
7 2018-01-01         2 Location L

预期结果:识别Obs.loc&之间模式的数据框/列表Obs.count
换句话说, 中是否有任何变量Obs.loc 共享一个Obs.date值,这些变量会发生变化Obs.count

例子:

#subset two dates
exB<-b %>% dplyr::filter(Obs.date=="2018-01-01" | Obs.date=="2018-01-02")

#output 
> str(exB)
'data.frame':   40 obs. of  3 variables:
 $ Obs.date : Date, format: "2018-01-01" "2018-01-01" "2018-01-01" ...
 $ Obs.count: int  1 1 2 2 2 2 2 2 3 3 ...
 $ Obs.loc  : chr  "Location U" "Location Y" "Location D" "Location E" ...

我们看到,从这个小子集中,exB包含 40obs。我想知道其中的任何观察结果Obs.loc是否Obs.count相关。例如,如果存在多个具有Obs.loc共享值的观察值Obs.date,那么观察值是否会Obs.count发生变化?也许,比如说,[Location U & Location X] 都在Obs.date. 由此,假设 [Location U] 在 [2018-01-01] 上的值为Obs.count[1],Obs.date并且该值在 [2018-01-02] 上增加到 [2 Obs.date]。让我们进一步想象 [Location X] 发生了相反的情况。我想这样做,但对整个数据集:) 我希望我解释得很好。

创建了 的列表data.frame,其中每个数据框都是唯一的日期:

newList<-split(b,b$Obs.date)

#output truncated...
List of 365
 $ 2018-01-01:'data.frame': 22 obs. of  3 variables:
  ..$ Obs.date : Date[1:22], format: "2018-01-01" "2018-01-01" "2018-01-01" ...
  ..$ Obs.count: int [1:22] 1 1 2 2 2 2 2 2 3 3 ...
  ..$ Obs.loc  : chr [1:22] "Location U" "Location Y" "Location D" "Location E" ...
 $ 2018-01-02:'data.frame': 18 obs. of  3 variables:
  ..$ Obs.date : Date[1:18], format: "2018-01-02" "2018-01-02" "2018-01-02" ...
  ..$ Obs.count: int [1:18] 0 0 1 1 2 2 2 2 3 4 ...
  ..$ Obs.loc  : chr [1:18] "Location V" "Location Z" "Location F" "Location V" ...

希望这能让它更清楚。从这里,我想看看哪些位置(一起)出现在多个数据框中以及相关的计数。

根据评论,更新示例:

#Create three different subsets, by dates:
Date1<-b %>%
  filter(Obs.date == as.Date("2018-01-01"))
Date2<-b %>%
  filter(Obs.date == as.Date("2018-01-03"))
Date3<-b %>%
  filter(Obs.date == as.Date("2018-01-05"))

#Some of the Locations have multiple observations for the same date, I am aggregating them:

FDate1<-aggregate(Obs.count~Obs.loc+Obs.date,data=Date1,FUN=sum)
FDate2<-aggregate(Obs.count~Obs.loc+Obs.date,data=Date2,FUN=sum)
FDate3<-aggregate(Obs.count~Obs.loc+Obs.date,data=Date3,FUN=sum)

#Further subset by locations that share dates across the dataframes. Here I chose two random locations (Location E & Location L)

Sample1<-FDate1 %>% filter (Obs.loc=='Location E')
Sample1B<-FDate2 %>% filter (Obs.loc=='Location E')
Sample2<-FDate1 %>% filter (Obs.loc=='Location L')
Sample2B<-FDate2 %>% filter (Obs.loc=='Location L')

#Merge the filtered locations (there has to be a less tedious way, right?)
Sample1Merge<-rbind(Sample1,Sample1B)
Sample2Merge<-rbind(Sample2,Sample2B)
FullMerge<-rbind(Sample1Merge,Sample2Merge)

#The final output:

> print(FullMerge)
     Obs.loc   Obs.date Obs.count
1 Location E 2018-01-01         2
2 Location E 2018-01-03         4
3 Location L 2018-01-01         6
4 Location L 2018-01-03         1

从这里开始,我们就快到了。我们有两个共享日期的位置,以及它们的计数。现在,我想注释Obs.loc.

在此示例中,在两个日期之间,我们看到:

Obs.loc 位置 E增加 [从 2->4]
Obs.loc 位置 L减少 [从 6->1]

因此,我们观察到两个水平之间的负相关关系。

这是我想要完成的,但在整个数据集(数据集 b)。

  1. 哪些级别Obs.loc的日期相同。
  2. 在确定的那些(#1)中,观察到的变化是什么(如果有的话)。

这将使我能够识别数据中的关系,即在共享多个日期时计数是相互依赖还是相互独立。

标签: rcountpoisson

解决方案


推荐阅读