基于特定分布按组从数据帧中采样

Cor*_*bjn 2 r sample distribution dataframe dplyr

我正在尝试从数据框中进行采样,但条件是样本代表了我的案例中特定标准的分布。数据框的结构如下:

df <- data.frame(Locaton = c('A', 'B', 'B', 'B', 'C', 'C', ...),
                 Veg_Species = c('X', 'Y', 'Z', 'Z', 'Z', 'Z', ...),
                 Date_Diff = c(2, 5, 2, 0, 4, 4, ...))
Run Code Online (Sandbox Code Playgroud)

重要的是要知道每个的数量Veg_Species不同。这意味着X出现了 25 次,例如Y45 次和78 次。Z现在我想Veg_Species根据最小样本的分布Date_Diff不同的样本中进行采样。在这种情况下,这意味着从Date_diff分布中的每个物种中进行抽样X

我想我可以这样做dplyr

sample.species <- df %>%
  filter(Veg_Species == 'Z') %>%
  sample_n(25, replace = TRUE)
Run Code Online (Sandbox Code Playgroud)

但这显然只是从所有Veg_Species具有该名称的样本中随机采样Z

我如何也考虑分布?

有关更详细的示例,请单击此处

Dar*_*sai 5

也许您可以尝试对 的分布进行核密度估计Date_Diff

1. 数据及包装

df <- read.csv("http://www.sharecsv.com/dl/2a26bf2c69bfd76e8ddcecd1c3739a31/ex.csv", row.names = 1)
library(dplyr)
Run Code Online (Sandbox Code Playgroud)

2. 找到最小的物种

df %>% count(Species)

#                   Species  n
# 1 Adenostoma fasciculatum 95
# 2     Artemisia filifolia 26
# 3  Eriogonum fasciculatum 41
# 4              Tamarix L. 27
Run Code Online (Sandbox Code Playgroud)

3.分布的核密度估计和线性插值

参考:https://stats.stackexchange.com/a/78775/218516

val <- df$Date_Diff[df$Species == "Artemisia filifolia"]
dist.fun <- approxfun(density(val))
Run Code Online (Sandbox Code Playgroud)

4. 取样

此后sample_n()已被 取代。slice_sample()dplyr 1.0.0

df2 <- df %>%
  group_by(Species) %>% 
  slice_sample(n = 26, weight_by = dist.fun(Date_Diff)) %>%
  ungroup()
Run Code Online (Sandbox Code Playgroud)

5. 检查

df2 %>% count(Species)

#   Species                     n
#   <chr>                   <int>
# 1 Adenostoma fasciculatum    26
# 2 Artemisia filifolia        26
# 3 Eriogonum fasciculatum     26
# 4 Tamarix L.                 26
Run Code Online (Sandbox Code Playgroud)