r - 如何提取一起变化的变量?
问题描述
我有一个共享相同日期的变量的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)。
- 哪些级别
Obs.loc
的日期相同。 - 在确定的那些(#1)中,观察到的变化是什么(如果有的话)。
这将使我能够识别数据中的关系,即在共享多个日期时计数是相互依赖还是相互独立。
解决方案
推荐阅读
- angularjs - 爸爸解析返回大 csv 的空数组
- python - 如何忽略正面前瞻(正则表达式)的第一个换行符
- javascript - 网站不会使用 enter 提交,但会使用提交按钮提交
- android - 如何检测图像中的特定对象
- python - 根据 Selenium Python 中的值单击按钮
- php - 面临网站上 Hreflang 标签的问题
- android - YouTubePlayerSupportFragment 给我看 - 此视频不可用
- bash - 如果 CSV 2 和 CSV 1 中的字段具有字段匹配,则删除第二个 CSV 的行
- python - 使用 XML 文件中的 Python,我只想获取具有值的标签?
- php - 为什么在这种情况下 print_r 不能按预期工作