我需要随机抽样以长格式排列的数据集。在我的数据集中,每个主题有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)
请不要建议将日期重新格式化为格式并在那里进行采样,因为我知道我可以这样做。我确信必须有一种以长格式进行采样的方法。
答案 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
工作,但不华丽。