r - 来自不同数据框的样本

标签 r data.table sample

 data1=data.frame("Group1" = sample(1:2,100,r=T),
                  "Group2" = sample(c('a','b'),100,r=T),
                  "V1" = sample(1:3, 100, r=T),
                  "V2" = sample(0:1, 100, r=T),
                  "V3" = sample(1:5, 100, r=T),
                  "V4" = sample(1:2, 100, r=T))


data2=data.frame("Group1"=c(1,1,2,2),
                  "Group2"=c('a','b','a','b'),
                  "Size"=c(9,7,6,10),
                  "V1"=c(NA),
                  "V2"=c(NA),
                  "V3"=c(NA),
                  "V4"=c(NA))

我有包含我的数据的“data1”。然后我有'data2',它有'Group1'和'Group2'和'Size'。
我想要的是将我的数据按('Group1' 和 'Group2')分组,并从 'data1' 中随机抽取大小为 'Size' 的样本来填充 data2 中的 V1-V4。

有希望的输出看起来像这样,但根据“data1”填充了 NA 值
library(dplyr);library(tidyr)
data3= data2 %>% 
  uncount(Size)

最佳答案

library(data.table)
setDT(data1)
setDT(data2)

# sample indices from each group
i <- 
  data2[data1, on = .(Group1, Group2)
      ][, .(i_samp = sample(.I, Size)), by = .(Group1, Group2, Size)
      ][, i_samp]

# subset to sampled indices
merge(data1[i], data2[, .(Group1, Group2, Size)])

#     Group1 Group2 V1 V2 V3 V4 Size
#  1:      1      a  3  1  2  2    9
#  2:      1      a  3  1  5  1    9
#  3:      1      a  2  1  4  2    9
#  4:      1      a  3  1  1  1    9
#  5:      1      a  3  1  4  1    9
#  6:      1      a  1  0  3  1    9
#  7:      1      a  3  1  1  1    9
#  8:      1      a  1  1  1  2    9
#  9:      1      a  2  0  2  1    9
# 10:      1      b  2  0  5  2    7
# 11:      1      b  3  0  5  2    7
# 12:      1      b  3  1  4  2    7
# 13:      1      b  1  1  1  1    7
# 14:      1      b  1  1  4  1    7
# 15:      1      b  1  0  1  1    7
# 16:      1      b  1  0  3  1    7
# 17:      2      a  2  0  5  1    6
# 18:      2      a  1  0  5  1    6
# 19:      2      a  3  1  1  2    6
# 20:      2      a  1  0  2  1    6
# 21:      2      a  3  1  1  2    6
# 22:      2      a  1  1  3  2    6
# 23:      2      b  3  0  2  1   10
# 24:      2      b  2  1  5  1   10
# 25:      2      b  3  0  1  1   10
# 26:      2      b  3  1  2  1   10
# 27:      2      b  2  0  5  1   10
# 28:      2      b  2  0  2  1   10
# 29:      2      b  2  0  2  2   10
# 30:      2      b  1  0  1  1   10
# 31:      2      b  3  0  5  1   10
# 32:      2      b  3  0  5  1   10
#     Group1 Group2 V1 V2 V3 V4 Size

使用的输入数据:
data1=data.frame("Group1" = sample(1:2,100,r=T),
                  "Group2" = sample(c('a','b'),100,r=T),
                  "V1" = sample(1:3, 100, r=T),
                  "V2" = sample(0:1, 100, r=T),
                  "V3" = sample(1:5, 100, r=T),
                  "V4" = sample(1:2, 100, r=T))


data2=data.frame("Group1"=c(1,1,2,2),
                  "Group2"=c('a','b','a','b'),
                  "Size"=c(9,7,6,10),
                  "V1"=c(NA),
                  "V2"=c(NA),
                  "V3"=c(NA),
                  "V4"=c(NA))

这是一个参数化程度更高的版本,您可以在其中明确设置要填充的列以及连接两个表的键
fill_key <- c('Group1', 'Group2')
columns_to_fill <- paste0('V', 1:4)

# sample indices from each group
i <- 
  data2[data1, on = (fill_key)
      ][, .(i_samp = sample(.I, Size)), by = c(fill_key, 'Size')
      ][, i_samp]


# subset to sampled indices
merge(data1[i, c(fill_key, columns_to_fill), with = FALSE], 
      data2[, c(fill_key, 'Size'), with = FALSE])

关于r - 来自不同数据框的样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60849545/

相关文章:

r - 使用 mean() 和 sum()/.N 时,按组的 data.table 平均值提供不同的结果

r - 将两列绘制为条形图,将第三列绘制为折线图 ggplot

r - 增加 ggmap 的地理编码功能中的 api 限制(在 R 中)

r - 根据数据集中的另一个变量设置背景颜色

web-services - 对 RESTful Web 服务有疑问吗?

python - 如何在Python中使用random.sample()后获取剩余的样本?

python - 如何在不更换的情况下进行增量采样?

R map 数据与 ggplot 坐标?

r - 计算 R 中 data.table 两列之间转换概率的简洁方法

r - 基于日期范围的数据表合并