【问题标题】:Stratified random sample in dplyr with filtered groups具有过滤组的 dplyr 中的分层随机样本
【发布时间】:2019-07-26 14:51:59
【问题描述】:

我正在尝试根据两个分组变量(传感器位置和日期)创建分层随机文件样本。并非所有传感器都有相同数量的观察结果(电池在最后一天耗尽)。

我正在做的主要工作是使用 dplyr 来处理我的数据,通过获取每个传感器日组合的一些观察结果,并过滤掉那些少于我最终分层样本所需的观察结果。

这是我正在处理的数据的负责人:

structure(list(fullPath = c("S4A00440_20180508_123353.flac", 
"S4A00440_20180508_123353.wav", "S4A00440_20180508_130000.flac", 
"S4A00440_20180508_133000.flac", "S4A00440_20180508_140000.flac", 
"S4A00440_20180508_143000.flac", "S4A00440_20180508_150000.flac", 
"S4A00440_20180508_153000.flac", "S4A00440_20180508_160000.flac", 
"S4A00440_20180508_163000.flac", "S4A00440_20180508_170000.flac", 
"S4A00440_20180508_173000.flac", "S4A00440_20180508_180000.flac", 
"S4A00440_20180508_183000.flac", "S4A00440_20180508_190000.flac", 
"S4A00440_20180508_193000.flac", "S4A00440_20180508_200000.flac", 
"S4A00440_20180508_203000.flac", "S4A00440_20180508_210000.flac", 
"S4A00440_20180508_213000.flac", "S4A00440_20180508_220000.flac", 
"S4A00440_20180508_223000.flac", "S4A00440_20180508_230000.flac", 
"S4A00440_20180508_233000.flac", "S4A00466_20180508_130000.flac", 
"S4A00466_20180508_130000.wav", "S4A00466_20180508_133000.flac", 
"S4A00466_20180508_140000.flac", "S4A00466_20180508_143000.flac", 
"S4A00466_20180508_150000.flac", "S4A00466_20180508_153000.flac", 
"S4A00466_20180508_160000.flac", "S4A00466_20180508_163000.flac", 
"S4A00466_20180508_170000.flac", "S4A00466_20180508_173000.flac", 
"S4A00466_20180508_180000.flac", "S4A00466_20180508_183000.flac", 
"S4A00466_20180508_190000.flac", "S4A00466_20180508_193000.flac", 
"S4A00466_20180508_200000.flac", "S4A00466_20180508_203000.flac", 
"S4A00466_20180508_210000.flac", "S4A00466_20180508_213000.flac", 
"S4A00466_20180508_220000.flac", "S4A00466_20180508_223000.flac", 
"S4A00466_20180508_230000.flac", "S4A00466_20180508_233000.flac"), 
sensorName = c("S4A00440", "S4A00440", "S4A00440", "S4A00440", 
"S4A00440", "S4A00440", "S4A00440", "S4A00440", "S4A00440", "S4A00440", 
"S4A00440", "S4A00440", "S4A00440", "S4A00440", "S4A00440", "S4A00440", 
"S4A00440", "S4A00440", "S4A00440", "S4A00440", "S4A00440", "S4A00440", 
"S4A00440", "S4A00440", "S4A00466", "S4A00466", "S4A00466", "S4A00466", 
"S4A00466", "S4A00466", "S4A00466", "S4A00466", "S4A00466", "S4A00466", 
"S4A00466", "S4A00466", "S4A00466", "S4A00466", "S4A00466", "S4A00466", 
"S4A00466", "S4A00466", "S4A00466", "S4A00466", "S4A00466", "S4A00466", 
"S4A00466"), 
Date = structure(c(1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 1525737600, 
1525737600, 1525737600), 
class = c("POSIXct", "POSIXt"), tzone = "UTC")), 
row.names = c(1114L, 1115L, 1116L, 1117L, 1118L, 1119L, 1120L, 1121L, 1122L, 1123L, 
1124L, 1125L, 1126L, 1127L, 1128L, 1129L, 1130L, 1131L, 1132L, 
1133L, 1134L, 1135L, 1136L, 1137L, 1395L, 1396L, 1397L, 1398L, 
1399L, 1400L, 1401L, 1402L, 1403L, 1404L, 1405L, 1406L, 1407L, 
1408L, 1409L, 1410L, 1411L, 1412L, 1413L, 1414L, 1415L, 1416L, 
1417L), class = "data.frame")

我是如何尝试采样的

foo_strat <- foo %>% 
  select(fullPath, sensorName, Date) %>% 
  group_by(sensorName, Date) %>% 
  summarise(num_recs = length(fullPath)) %>% 
  dplyr::filter(num_recs > 12) %>% 
  sample_n(12)

但是,我收到了这个错误:

错误:“大小”必须小于或等于 7(数据大小),设置 replace = TRUE 以使用带替换的采样

我检查了this issue,这表明我正在尝试做的可能不是函数的行为,在这种情况下,我不确定最好的方法是什么

【问题讨论】:

  • 您的输入不完整。请复制/粘贴完整的 dput 输出
  • 谢谢。我重新格式化并向 dput 添加了更多数据,这应该使错误更具重现性。
  • 是的,每个组的summarise 步骤之后只有一行

标签: r dplyr sampling


【解决方案1】:

summarise 汇总为每组单行。所以,我们没有足够的数据点来执行sample_n。相反,我们可以直接使用n()filter 应用于整个数据(给出行数)

library(dplyr)
foo %>% 
   select(fullPath, sensorName, Date) %>% 
   group_by(sensorName, Date) %>%
   filter(n() > 12) %>%
   sample_n(12)
# A tibble: 24 x 3
# Groups:   sensorName, Date [2]
#   fullPath                      sensorName Date               
#   <chr>                         <chr>      <dttm>             
# 1 S4A00440_20180508_193000.flac S4A00440   2018-05-08 00:00:00
# 2 S4A00440_20180508_160000.flac S4A00440   2018-05-08 00:00:00
# 3 S4A00440_20180508_183000.flac S4A00440   2018-05-08 00:00:00
# 4 S4A00440_20180508_190000.flac S4A00440   2018-05-08 00:00:00
# 5 S4A00440_20180508_200000.flac S4A00440   2018-05-08 00:00:00
# 6 S4A00440_20180508_150000.flac S4A00440   2018-05-08 00:00:00
# 7 S4A00440_20180508_230000.flac S4A00440   2018-05-08 00:00:00
# 8 S4A00440_20180508_223000.flac S4A00440   2018-05-08 00:00:00
# 9 S4A00440_20180508_163000.flac S4A00440   2018-05-08 00:00:00
#10 S4A00440_20180508_133000.flac S4A00440   2018-05-08 00:00:00
# … with 14 more rows

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    相关资源
    最近更新 更多