基于R中的数据帧的样本
假设我们有两个数据帧data1和data2,它们都有相同的列,例如基于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中获取代表性样
> 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()