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

当数据为长格式时,R中的随机样本,r,sampling,random-sample,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

我需要随机抽样一个长格式的数据集。在我的数据集中,每个受试者有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-packaged(见下文),但如果我给出一个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)
库(dplyr)
子集%
按性别划分的组别%>%
样本(2)

请不要建议将日期改为宽幅格式并在那里取样,因为我知道我可以做到这一点。我确信一定有一种方法可以进行长格式的采样。

我不确定我是否完全理解您的要求。这样行吗

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

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

我将从患者姓名中取样,然后根据取样的姓名进行过滤:

看看所有的男性

male_subset <- data %>% filter(sex == "m")
这将返回两个取样个体中每个个体的所有四行。

在基数R中

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

Subset如果选择了P1,您想选择所有P1观测值,还是只选择P1中的一个观测值?所有P1观测值。我的解决方案的问题是,我只得到一个观察每个子,我想保留所有4。谢谢,但没有看到做我需要的。使用这段代码,我只得到4行或8行。每个主题至少有行(每个主题4行)。我需要的不是对行进行采样,而是对主题进行采样,其中主题在多行中有数据。我认为您的两个采样ID可能相等。如果不查看唯一ID,则可以对同一个人的ID进行两次采样,然后在结果data.frame中只包含一个人(和四行),而不是两个人和8行。我刚刚尝试了此解决方案。它也起作用。我认为sample()的默认行为是“replace=FALSE”,因此我认为不会有重复的行为。从
?sample()
“sample(x,size,replace=FALSE,prob=NULL)”开始,我认为不会有问题。然而,我更喜欢@BarkleyBG的解决方案。它更像R。
data[data$sex==“m”,]$sub
是否包含重复条目?如果是这样,那么样本就有可能多次随机选择同一条目,即使没有替换。事实上,在这种情况下,当抽样的数量(即
大小
)大于男性数量时,它肯定会这样做。啊,我明白你现在的意思了。是的,你说得对。它需要是
sample(unique(data[data$sex==“m”,]$sub,2)
…如果我们不包括
unique()
,我们实际上有可能得不到两个唯一的主题。打得好。太好了!这正是我想要的。非常感谢@BarkleyBG
sampled_IDs <- sample(male_IDs, 2)
data %>% filter(sub %in% sampled_IDs)
set.seed(1)
subset<- sample(data[data$sex == "m",]$sub,2)
data_subset<-data[data$sub %in% subset,]
nrow(data_subset)
# [1] 8