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

时间:2016-06-03 17:45:46

标签: r sampling random-sample

我需要随机抽样以长格式排列的数据集。在我的数据集中,每个主题有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

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

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

请不要建议将日期重新格式化为格式并在那里进行采样,因为我知道我可以这样做。我确信必须有一种以长格式进行采样的方法。

3 个答案:

答案 0 :(得分:3)

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

看看所有男性

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

寻找独特的男性身份证

male_IDs <- unique(male_subset$sub)

来自唯一ID的样本

sampled_IDs <- sample(male_IDs, 2)

现在,您可以根据这些采样ID来对数据进行分组:

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

这应该为2个采样个体中的每一个返回所有四行。

答案 1 :(得分:0)

我不确定我是否完全理解你想要的东西。会这样做吗?

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

当然,您必须更改paste0功能中的实际数据内容。

答案 2 :(得分:0)

在基地R,

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

工作,但不华丽。