当数据为长格式时,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
有效,但不华而不实。
我需要随机抽取一个以长格式排列的数据集。在我的数据集中,每个主题都有 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
有效,但不华而不实。