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。
我如何也考虑分布?
有关更详细的示例,请单击此处。
也许您可以尝试对 的分布进行核密度估计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)
| 归档时间: |
|
| 查看次数: |
938 次 |
| 最近记录: |