r - R - 为多个样本组创建大小为 n 的随机子样本
问题描述
我有大量样本数据集,这些样本属于不同的组,并且覆盖的区域不同。数据集的结构简化如下。我现在想为每个组创建合并样本(子组),其中每个子组覆盖的区域等于指定区域(例如 20)。样本应随机分配且不替换到每个子组,并且子组的数量应在数据框末尾的新列中列出。
SampleID Group Area Subgroup
1 A 1.5 1
2 A 3.8 2
3 A 6 4
4 A 1.9 1
5 A 1.5 3
6 A 4.1 1
7 A 3.7 1
8 A 4.5 3
...
300 B 1.2 1
301 B 3.8 1
302 B 4.1 4
303 B 2.6 3
304 B 3.1 5
305 B 3.5 3
306 B 2.1 2
...
2000 S 2.7 5
...
我目前正在使用“cumsum”命令创建子组,使用下面的代码。
dat <- read.table("Pooling_Test.txt", header = TRUE, sep = "\t")
dat$CumArea <- cumsum(dat$Area)
dat$Diff_CumArea <- c(0, head(cumsum(dat$Area), -1))
dat$Sample_Int_1 <- "0"
dat$Sample_End <- "0"
current.sum <- 0
for (c in 1:nrow(dat)) {
current.sum <- current.sum + dat[c, "Area"]
dat[c, "Diff_CumArea"] <- current.sum
if (current.sum >= 20) {
dat[c, "Sample_Int_1"] <- "1"
dat[c, "Sample_End"] <- "End"
current.sum <- 0
dat$Sample_Int_2 <- cumsum(dat$Sample_Int_1)+1
dat$Sample_Final <- dat$Sample_Int_2
for (d in 1:nrow(dat)) {
if (dat$Sample_End[d] == 'End')
dat$Subgroup[d] <- dat$Sample_Int_2[d]-1
else 0 }
}}
write.csv(dat, file = 'Pooling_Test_Output.csv', row.names = FALSE)
生成的数据框显示了我想要的(见下文)。但是,有几个步骤我想改进。首先,我有一个问题,包括从每个组中随机选择样本的命令,所以我目前在将数据帧加载到 R 之前随机化样本的顺序。其次,在输出表中,子组是连续编号的,但我想开始每个新组的子组编号为 1。有人对如何实现这一目标有任何建议吗?
SampleID Group CumArea Subgroups
1 A 1.5 1
77 A 4.6 1
6 A 9.3 1
43 A 16.4 1
17 A 19.5 1
67 A 2.1 2
4 A 4.3 2
32 A 8.9 2
...
300 B 4.5 10
257 B 6.8 10
397 B 10.6 10
344 B 14.5 10
367 B 16.7 10
303 B 20.1 10
306 B 1.5 11
...
解决方案
包中的一些功能dplyr
使这相当简单。您可以使用slice
随机化数据、group_by
在组级别执行计算以及mutate
创建新变量。如果您将函数与%>%
运算符链接在一起,我相信解决方案看起来像这样,假设您想要加起来为 20 个的组。
install.packages("dplyr") #If you haven't used dplyr before
library(dplyr)
dat %>%
group_by(Group) %>%
slice(sample(1:n())) %>%
mutate(CumArea = cumsum(Area), SubGroup = ceiling(CumArea / 20))
推荐阅读
- electron - 节点通知程序在生产中不工作 | 我做错了什么?
- reactjs - 我们可以在 React 应用程序中覆盖 webpack DefinePlugin 的变量吗
- node.js - Runtime.HandlerNotFound aws lambda node.js
- css - 如何使用滚动捕捉 CSS 控制/更改动画的速度?
- python - Tableview 列自动调整
- java - 如何在 Querydsl 中实例化`PostgreSQLQuery`?
- javascript - 在我的 chrome 扩展程序和网站之间共享 cookie
- android - NoSuchMethodError ConstantExpressionEvaluator.evaluateExpression 添加jetpack compose时
- javascript - 为什么 Google Apps 脚本不允许我将我的范围称为变量?
- javascript - React 子组件从传入的内容接收不同的道具