当数据为长格式时,R 中的随机样本

Random sample in R when data is in long format

我需要随机抽取一个以长格式排列的数据集。在我的数据集中,每个主题都有 4 个观察值,因此如果我随机抽取一行,我会随机丢失每个主题的一个或多个观察值。

这是一个模拟数据,用于说明目的,我的数据要大得多。

sub sex group   dv1 dv2
P1  m   A   0.66    0.94
P1  m   B   0.98    0.26
P1  m   C   0.02    0.03
P1  m   D   0.60    0.30
P2  m   A   0.92    0.99
P2  m   B   0.82    0.09
P2  m   C   0.44    0.67
P2  m   D   0.53    0.80
P3  f   A   0.29    0.22
P3  f   B   0.46    0.20
P3  f   C   0.37    0.77
P3  f   D   0.76    0.54
P4  m   A   0.28    0.99
P4  m   B   0.16    0.57
P4  m   C   0.46    0.75
P4  m   D   0.28    0.21

在这个例子中,我需要随机 select 2 名男性。例如,我尝试使用打包的 dplyr(见下文),但如果我给出 2 的样本,它只为 sex="m" 提供 2 行,为 sex="f" 提供 2 行。总共有 4 个随机选择的行。我需要它做的是给我 8 行,其中 4 行来自一位男性,4 行来自另一位。将分组参数更改为 sub 不起作用,因为它会说组中只有 2 个级别(实际上,它会在这个玩具示例中工作,因为每个子有 4 个级别,但请注意我是从更大的数据集中选择 50 个样本)。此外,它只会为每个子随机提供 2 行,这不是我需要的。

library(dplyr)  
subset <- data %>%  
group_by(sex) %>%  
sample_n(2)

请不要建议将日期重塑为宽格式并在那里采样,因为我知道我可以做到。我相信一定有办法以长格式进行采样。

我不确定我是否完全理解你想要什么。这样可以吗?

data %>% filter(sex == 'm') %>% filter(sub %in% sample(paste0('P',1:4), 2))

当然,您必须为真实数据更改 paste0 函数中的内容。

我将从患者姓名中抽样,然后按这些抽样姓名进行过滤:

看看所有男性

male_subset <- data %>% filter(sex == "m")

寻找唯一的男性 ID

male_IDs <- unique(male_subset$sub)

来自唯一 ID 的示例

sampled_IDs <- sample(male_IDs, 2)

现在您根据这些采样 ID 对数据进行子集化:

data %>% filter(sub %in% sampled_IDs)

这应该 return 2 个抽样个体中每个人的所有四行。

在基础 R 中,

set.seed(1)
subset<- sample(data[data$sex == "m",]$sub,2)
data_subset<-data[data$sub %in% subset,]
nrow(data_subset)
# [1] 8

有效,但不华而不实。