如何在分组变量中提取对的样本

时间:2017-12-09 07:17:53

标签: r

我的数据如下:

x  y 
1  1
2  2
3  2
4  4
5  5
6  6
7  6
8  8
9  9 
10  9
11  11
12  12
13  13
14  13
15  14
16  15
17  14
18  16
19  17
20  18

y是一个分组变量。我想看看这个分组的表现如何。 因此,我想提取由变量y组合在一起的n对案例的样本 和n对不通过变量y组合在一起的情况。为了计算数量 误报和漏报(虚假分组或不分组)。如何提取分组对的样本 和一组未分组的对?

我希望样本看起来像这样(对于n = 6): 分组样本:

x  y
2  2
3  2
9  9
10  9
15  14
17  14

未分组的样本:

x  y
1  1
2  2
6  8
6  8
11  11
19  17

我将如何在R中进行此操作?

1 个答案:

答案 0 :(得分:1)

我并不完全清楚你喜欢做什么,部分原因是因为我觉得你想要实现的目标缺少一些背景。我也不太了解您的预期输出(例如,未分组的示例包含原始数据中不存在的条目6 8 ...)

除此之外,这是一种可行的方法。

# Maximum number of samples per group
n <- 3;

# Set fixed RNG seed for reproducibility
set.seed(2017);

# Grouped samples
df.grouped <- do.call(rbind.data.frame, lapply(split(df, df$y),
    function(x) if (nrow(x) > 1) x[sample(min(n, nrow(x))), ]));
df.grouped;
#       x  y
#2.3    3  2
#2.2    2  2
#6.6    6  6
#6.7    7  6
#9.10  10  9
#9.9    9  9
#13.13 13 13
#13.14 14 13
#14.15 15 14
#14.17 17 14


# Ungrouped samples
df.ungrouped <- df[sample(nrow(df.grouped)), ];
df.ungrouped;
#    x y
#7   7 6
#1   1 1
#9   9 9
#4   4 4
#3   3 2
#2   2 2
#5   5 5
#6   6 6
#10 10 9
#8   8 8

说明:根据df拆分y,然后从包含min(n, nrow(x))行的子集x中抽取>1个样本; rbind给出了分组df.grouped。然后,我们从nrow(df.grouped)中抽取df个样本,以生成未分组的df.ungrouped

样本数据

df <- read.table(text =
    "x  y
     1  1
     2  2
     3  2
     4  4
     5  5
     6  6
     7  6
     8  8
     9  9
     10  9
     11  11
     12  12
     13  13
     14  13
     15  14
     16  15
     17  14
     18  16
     19  17
     20  18", header = T)