我在网站上阅读了很多关于根据日期对第一个,最后一个或特定日期进行观察的大型数据集进行随机分组的帖子。但是,我有一个不同的挑战,需要我按站点和日期对大型数据集进行子采样。我想将所有网站保留在子集数据集中,但每个网站只包含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>
非常感谢任何建议。感谢。
答案 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。