【问题标题】:Random sample in R when data is in long format当数据为长格式时,R中的随机样本
【发布时间】:2016-10-03 21:14:14
【问题描述】:

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

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

【问题讨论】:

  • 如果选择了 P1,您想选择所有 P1 观察值,还是只选择 P1 中的一个观察值?
  • 所有 P1 观测值。我的解决方案的问题是每个子只得到一个观察结果,我想保留所有 4 个。

标签: r sampling random-sample


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,但没有看到做我需要的。使用此代码,我只得到 4 或 8 行。至少这些行是针对每个主题的(每个主题有 4 行)。我需要的不是对行进行抽样,而是对主题进行抽样,其中主题的数据不止一行。
【解决方案2】:

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

看看所有男性

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)

这应该返回 2 个抽样个体的所有四行。

【讨论】:

  • 太棒了!这就是我想要的。非常感谢@BarkleyBG
【解决方案3】:

在基础 R 中,

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

有效,但不华而不实。

【讨论】:

  • 我认为您的 2 个采样 ID 可能相等。如果您不查看唯一 ID,那么您可以对同一人的 ID 进行两次采样,然后在结果 data.frame 中只有一个人(和四行),而不是两个人有 8 行。
  • 我刚刚尝试过这个解决方案。它也有效。我认为 sample() 的默认行为是'replace = FALSE',所以我认为不会有重复。
  • 来自?sample() "sample(x, size, replace = FALSE, prob = NULL)" 所以我不相信会有问题。但是,我更喜欢@BarkleyBG 的解决方案。它更像 R。
  • data[data$sex=="m",]$sub 是否包含重复条目?如果是这样,那么即使没有替换,样本也有机会多次随机选择相同的条目。事实上,在这种情况下,当采样的数量(即size)大于男性数量时,它可以保证这样做。
  • 啊,我明白你现在在说什么了。是的,你是对的。它需要是...sample(unique(data[data$sex=="m",]$sub,2)...如果我们不包括unique(),实际上我们有可能得不到2 个独特的主题。好电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
相关资源
最近更新 更多