每个站点和日期随机分组1个观察

时间:2015-12-08 16:43:38

标签: r subset

我在网站上阅读了很多关于根据日期对第一个,最后一个或特定日期进行观察的大型数据集进行随机分组的帖子。但是,我有一个不同的挑战,需要我按站点和日期对大型数据集进行子采样。我想将所有网站保留在子集数据集中,但每个网站只包含1个日期观察。

更具体地说,我有4年的昆虫群落观察(n = 2000)的大型数据集(用于社区生态学!)。从大约900个站点观察它们,但每个站点在一年内有1到6个日期观察,没有站点在几年之间重复(这就是为什么以前在特定日期范围子集中的帖子不适用于此的原因)。由于我使用的统计分析类型,以这种特殊方式进行子集是至关重要的 - 包括分析中的空间自相关项意味着每个站点只能包含一个观察点。

所以完整的数据集看起来像:

Site        Date        Ladybug
Baumgarten  6/24/2014   2
Baumgarten  8/6/2014    0
Baumgarten  8/20/2014   3
Baumgarten  7/8/2014    0
Baumgarten  7/22/2014   1
Berkevich   7/9/2014    0
Berkevich   7/23/2014   4
Berkevich   8/8/2014    0
Berkevich   8/22/2014   0
Boehm       6/24/2014   2

# dput(data)
dd <- structure(list(Site = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L), .Label = c("Baumgarten", "Berkevich", "Boehm"), class = "factor"),  Date = structure(c(1L, 8L, 6L, 4L, 2L, 5L, 3L, 9L, 7L, 1L), .Label = c("6/24/2014", "7/22/2014", "7/23/2014", "7/8/2014",  "7/9/2014", "8/20/2014", "8/22/2014", "8/6/2014", "8/8/2014" ), class = "factor"), Ladybug = c(2L, 0L, 3L, 0L, 1L, 0L,  4L, 0L, 0L, 2L)), .Names = c("Site", "Date", "Ladybug"), class = "data.frame", row.names = c(NA,  -10L))

我想要的子集化数据集看起来像:

Site        Date        Ladybugs
Baumgarten  8/20/2014   3
Berkevich   7/9/2014    0
Boehm       6/24/2014   2

我有以MM / DD / YYYY和DOY格式输入的日期(因为网站之间不会重复多年,DOY x网站子集仍然可以确保没有重复的网站),因此使用其中任何一个的代码都可以工作。 / p>

非常感谢任何建议。感谢。

4 个答案:

答案 0 :(得分:3)

假设您的数据是名为data.frame的{​​{1}},您可以使用df并执行以下操作:

dplyr

答案 1 :(得分:2)

使用data.table您可以使用:

require(data.table)
setDT(DT)
DT[,.SD[sample(.N,1)], by=Site]

这会给你

         Site      Date Ladybug
1: Baumgarten 8/20/2014       3
2:  Berkevich 7/23/2014       4
3:      Boehm 6/24/2014       2

答案 2 :(得分:1)

您也可以使用base-R。它按站点拆分数据,对一行进行采样并返回。然后结果被绑定在一起。

set.seed(123)

res <- do.call(rbind,lapply(split(dat,dat$Site),function(x){x[sample(nrow(x),1),]}))

另一种可能性是data.table:

library(data.table)
setDT(dat)
set.seed(123)
res <- dat[,.SD[sample(.N,1)],Site]

答案 3 :(得分:0)

可能效率低下的方法,但它可以完成工作。

levels <- length(unique(data$Site))
rowselect<- sapply(1:levels, function(x) {
  elem <- which(array==unique(array)[x])
  if(length(elem)<2){
    return(elem)
  } else {
    return(sample(elem,1))
  }
})

这为每个站点提供了1个随机选择行的rowindex。