Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按组选择随机样本,附加条件为R_R_Random - Fatal编程技术网

按组选择随机样本,附加条件为R

按组选择随机样本,附加条件为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

基于这一点,我正在尝试制作一个行的样本。使用相同的R iris数据示例。我已经正确地为每个物种创建了15行的样本

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())