[英]Create random groups of 3 rows in R
我正在尝试从数据集中创建尽可能多的随机组。 我的数据很难解释,因此我以iris
为例。
在iris
, Species
变量包含3个唯一值: setosa
, versicolor
和virginica
。
我想将数据集随机分为3行,每组仅包含唯一的Species。 (例如,每个物种1个)
每个组必须有一个cumsum(Sepal.Width >= 10)
创建一个新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)
现在是dplyr
和tidyr
时间。 让我们将这些组合收集到一个名为tmp
的变量中,将tmp
与iris
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.