按组选择随机样本,附加条件为R
基于这一点,我正在尝试制作一个行的样本。使用相同的R iris数据示例。我已经正确地为每个物种创建了15行的样本按组选择随机样本,附加条件为R,r,random,R,Random,基于这一点,我正在尝试制作一个行的样本。使用相同的R iris数据示例。我已经正确地为每个物种创建了15行的样本 Selec_ir<-iris[ with(iris, unlist(tapply(seq_len(nrow(iris)), Species, FUN = sample, 15,replace=FALSE))), ] Selec\u ir以下函数将用于传递数据集中每组的所有行数,然后不替换地绘制样本,然后使用split和fin
Selec_ir<-iris[ with(iris, unlist(tapply(seq_len(nrow(iris)),
Species, FUN = sample, 15,replace=FALSE))), ]
Selec\u ir以下函数将用于传递数据集中每组的所有行数
,然后不替换地绘制样本
,然后使用split
和findInterval
组合删除步长内的所有值。返回的数组将用于切片
出所需样本大小和所需样本步长
根据需要修改样本大小
和样本步骤
,以调整初始样本大小和保留样本之间的行数
library(plyr)
sample_drop <- function(x, sample_size, sample_step=1) {
# draw sample and convert to list
lst_samp <- list(sort(sample(x, size=sample_size, replace=FALSE)))
# function to split last element of list by step size
split_last <- function(lst, step) {
lst_tail <- unlist(tail(lst, n=1L))
split(lst_tail, findInterval(lst_tail, c(0, step) + min(lst_tail)))
}
# split list until all values of last element fall within step size
while(do.call(function(x) max(x) - min(x), list(unlist(tail(lst_samp, n=1L)))) >= sample_step) {
lst_samp <- c(head(lst_samp, n=-1L), split_last(lst_samp, sample_step))
}
#lst_samp <- llply(lst_samp, unname) # for debug only to remove attr names
laply(lst_samp, min) # return minimum value from each element
}
下面是应用于较大的钻石数据集的函数
library(dplyr)
library(ggplot2)
data("diamonds")
sample <- list()
sample$seed <- 1
sample$size <- 1000L
sample$step <- 20L
set.seed(sample$seed)
diamonds %>%
group_by(cut) %>%
mutate(gid=row_number()) %>%
slice(sample_drop(n(), sample$size, sample$step))
set.seed(sample$seed)
diamonds %>%
group_by(cut) %>%
mutate(gid=row_number()) %>%
slice(sample_drop(n(), sample$size, sample$step)) %>%
summarise(samples=n())
库(dplyr)
图书馆(GG2)
数据(“钻石”)
样本百分比
分组依据(切割)%>%
变异(gid=行号())%>%
切片(样本滴(n(),样本$size,样本$step))%>%
总结(样本=n()
可能还有改进的余地,但这对我来说更容易理解你的问题有点不清楚;请提供所需输出的示例进行说明。当iris只有150行时,如何绘制比上一个样本至少多20行的15个样本?@manotheshark,很抱歉,我们只能随机选择2行而不是15行;内联Selec_ir@manotheshark,其思想是,如果选择了一行,则下一行必须至少位于上一行的第20位。这正是我想要的,但我是R初学者,从未使用过dplyr库。如何使其适应两个不同的数据集,其中:-我必须为每个物种随机选择15行(在这种情况下,我有7个物种,而不是3个物种用于鸢尾)代码中每个物种(13个物种)对应10行当我使用samp_步骤更改samp_大小时,得到以下错误:样本大小(7)大于种群大小(4)。您想替换为TRUE吗?
@freestyle该错误通常意味着您在告诉sample
绘制比原始长度
更多的样本,而replace=FALSE
。如果replace
设置为TRUE
,则可以从数据中重新绘制以填充指定的样本长度。您的评论说每个物种有10行,但我会首先查看,以确保您有足够的行,并且group\u by
命令设置正确。@freestyle尝试以下命令来验证每个组的行数iris%>%group\u by(物种)%%>%summary(n())
我的数据集中有43249行。@freestyle我改变了使用函数的方法。这应该适用于任何数据集,因为如果没有足够的值进行采样,它将减少样本大小。
library(dplyr)
library(ggplot2)
data("diamonds")
sample <- list()
sample$seed <- 1
sample$size <- 1000L
sample$step <- 20L
set.seed(sample$seed)
diamonds %>%
group_by(cut) %>%
mutate(gid=row_number()) %>%
slice(sample_drop(n(), sample$size, sample$step))
set.seed(sample$seed)
diamonds %>%
group_by(cut) %>%
mutate(gid=row_number()) %>%
slice(sample_drop(n(), sample$size, sample$step)) %>%
summarise(samples=n())