基于R中的数据帧的样本

基于R中的数据帧的样本,r,dataframe,sample,R,Dataframe,Sample,假设我们有两个数据帧data1和data2,它们都有相同的列,例如 > head(data1) ID Region Age Label 1 1 CC 20 0 2 2 BB 20 1 3 3 AA 40 0 4 4 BB 60 1 5 5 BB 40 0 6 6 BB 40 1 假设所有特征都是除ID以外的因子 问题:如何从基于data1的data2中获取代表性样

假设我们有两个数据帧data1和data2,它们都有相同的列,例如

 > head(data1)
  ID Region Age Label
1  1     CC  20     0
2  2     BB  20     1
3  3     AA  40     0
4  4     BB  60     1
5  5     BB  40     0
6  6     BB  40     1
假设所有特征都是除ID以外的因子

问题:如何从基于data1的data2中获取代表性样本?例如,根据数据1的产品频率,见下:取6个样本,区域:AA,年龄:20,标签:0,取1个样本,区域:AA,年龄:20,标签:1,等等

> head(count(data1, c("Region", "Age", "Label")))
  Region Age Label freq
1     AA  20     0    6
2     AA  20     1    1
3     AA  40     0    3
4     AA  40     1    5
5     AA  60     0    5
6     AA  60     1    3
我在看采样包和dplyr包。但我无法控制它。正式地说,我正在寻找一种基于data1中的特征分布从data2进行分层抽样的方法

多谢各位

编辑:首先,感谢@Jesse Tweedle使用dplyr在下面给出的简明答案。这里提供了一种使用采样函数strata和data.table库的替代部分解决方案:

library(sampling)
library(data.table)

d1 <- data.frame(ID = 1:100, 
                 region = sample(c("AA", "BB", "CC"), 100, replace = TRUE), 
                 age = sample(c(20,40,60),100,replace = TRUE), 
                 label = sample(c(0,1), 100, replace = TRUE))
d1.table = as.data.table(d1)

d2 <- data.frame(ID = 1:1000, 
                 region = sample(c("AA", "BB", "CC"), 1000, replace = TRUE), 
                 age = sample(c(20,40,60),1000,replace = TRUE), 
                 label = sample(c(0,1), 1000, replace = TRUE))
d2.table = as.data.table(d2)

#Sort
setkey(d1.table, region, age)
setkey(d2.table, region, age)

d1.table.freq = d1.table[,.N,keyby = list(region, age)]

d2.sample = data.table(strata(d2.table,
                              c("region", "age"),
                              d1.table.freq$N,
                              "srswor")) # random sampling without replacement
当然,这意味着d1中出现的所有特征组合(即不是0)必须出现在d2中,反之亦然。从这个角度来看,这不是一个普遍的解决方案,而是一个局部的解决方案。

部分dplyr答案 以下是一些假数据,带有计数数据集:


如果您的数据集差异很大,您可能必须在sample\n函数中使用replace=TRUE。

如果data1中只有一个AA样本,为什么要使用区域为AA的6个样本?@PoGibas我使用区域为AA、年龄为20、标签为0的6个样本。其中有6个,但我在上面只列出了data1的负责人,这就是为什么你只看到一个:很难仅用数据描述来回答。请使用dput发布数据1和数据2。你所说的产品频率是什么意思?@PoGibas这只是一个例子,例如,数据1非常好的主意。我得到一个错误,但是:错误:大小不是一个数字或整数向量。。。我正在尝试修复它…它对我的假数据而不是你的真实数据有效吗?还是两者都失败了?看起来都失败了。顺便说一句,真实数据将被转换成类似于示例数据的东西,因此不会有太大的差异。包版本可能会有差异。我使用的是R版本3.4.0和dplyr_0.7.4,你在用什么?您可以通过在linux ubuntu 16.4.3上运行sessionInfo.R版本3.4.3和dplyr_0.7.4来找到答案
data1 <- tibble(id = 1:30,
                region = sample(letters[1:3], 30, replace = TRUE),
                label = sample(0:1, 30, replace = TRUE))
counts <- data1 %>% group_by(region, label) %>% count()

data2 <- tibble(id = 1:300,
                region = sample(letters[1:3], 300, replace = TRUE),
                label = sample(0:1, 300, replace = TRUE))
data2 %>%
  left_join(counts) %>%
  split(list(data2$region, data2$label)) %>%
  map(~ sample_n(.x, size = unique(.x$n))) %>%
  bind_rows()