繁体   English   中英

在R中创建3行的随机组

[英]Create random groups of 3 rows in R

我正在尝试从数据集中创建尽可能多的随机组。 我的数据很难解释,因此我以iris为例。

irisSpecies变量包含3个唯一值: setosaversicolorvirginica

  1. 我想将数据集随机分为3行,每组仅包含唯一的Species。 (例如,每个物种1个)

  2. 每个组必须有一个cumsum(Sepal.Width >= 10)

  3. 创建一个新ID来标识每个组。

到目前为止,我已经尝试使用dplyr函数group_by()sample_n() 还要split()sample() ,但似乎无法获得所需的结果。

我认为使用split()可能是错误的方法。 我一直在努力让它沿这条路线运转,但是没有运气。

split(unique(iris), sample(1:nrow(iris) %/% 3))

尝试这样的事情:

#the sample
N=dim(iris)[1]
n=50 #sample size
set.seed(123)
si=iris[sample(N,n),c("Species","Sepal.Width")]

#the "cumsum"
lim=2.8 #for the conditional sum
Sepal.Width=sapply(split(si,si$Species),function(x)
   sum(x$Sepal.Width >= lim))
sol=data.frame(Species=names(Sepal.Width),Sepal.Width)
sol$ID=1:length(sol[,1])
sol
#               Species Sepal.Width ID
# setosa         setosa          18  1
# versicolor versicolor           8  2
# virginica   virginica          14  3

我想我明白这个问题。 这是使用dplyr的方法

首先,加载一些程序包,并为iris data.frame中的每一行添加唯一的ID。

library(dplyr)
library(tidyr)
iris = iris %>% mutate(Row.ID=1:n())

然后,让我们根据种类拆分Row.ID,并获得一个data.frame,其中包含每个种类的一行的所有可能组合

iris_split = split(iris$Row.ID, iris$Species)
combinations = do.call(expand.grid, iris_split)

现在是dplyrtidyr时间。 让我们将这些组合收集到一个名为tmp的变量中,将tmpiris data.frame的其余部分合并,然后根据条件进行过滤。

tmp = combinations %>%
    mutate(Group.ID=1:n()) %>%
    gather(Var, Row.ID, -Group.ID) %>%
    select(-Var)

result = iris %>%
    inner_join(tmp) %>%
    group_by(Group.ID) %>%
    filter(sum(Sepal.Length) > 10) %>%
    arrange(Group.ID)

result data.frame应该是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM