从其他数据帧的子集中获取随机样本

时间:2017-05-24 14:25:03

标签: r dataframe subset

我有一个100,000行的大数据帧,我想添加一个列,其中值是基于数据帧中的通用名称的另一个数据帧的子集的样本。可能更容易用例子来解释......

largeDF <- data.frame(colA = c('a', 'b', 'b', 'a', 'a', 'b'),
                      colB = c('x', 'y', 'y', 'x', 'y', 'y'),
                      colC = 1:6)

sampleDF <- data.frame(colA = c('a','a','a','a','b','b','b','b','b','b'),
                       colB = c('x','x','y','y','x','y','y','y','y','y'),
                       sample = 1:10)

然后,我想向sample添加一个新列largeDF,这是samplesampleDF列的随机样本,用于{{1}的相应子集}和colA

例如,对于第一行,值为colBa,因此该值将是x1的随机样本,用于下一行(2b)它将是y的随机样本。

所以我们最终会得到类似的东西:

6, 7, 8, 9 or 10

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:1)

使用dplyr ...(这会引发一些警告,但无论如何似乎都有效。)

library(dplyr)

largeDF <- largeDF %>% group_by(colA,colB) %>% 
            mutate(sample=sample(sampleDF$sample[sampleDF$colA==colA & sampleDF$colB==colB],
                   size=n(),replace=TRUE))

largeDF

    colA   colB  colC sample
  <fctr> <fctr> <int>  <int>
1      a      x     1      2
2      b      y     2      6
3      b      y     3      9
4      a      x     4      1
5      a      y     5      4
6      b      y     6      9

答案 1 :(得分:1)

你可以这样做:

largeDF$sample <- apply(largeDF,1,function(a) 
                     with(sampleDF, sample(sampleDF[colA==a[1] & colB==a[2],]$sample,1)))

答案 2 :(得分:0)

我不太明白这个问题,但似乎你只是在大数据框中添加一个新的列,它只是采样的&#34;样本&#34;子样本中的列... 看看下面的代码是否能让您了解所需的功能:

cbind.data.frame(largeDF, sample = sample(sampleDF$sample, nrow(largeDF)))
#  colA colB colC sample
#1    a    x    1      9
#2    b    y    2     10
#3    b    y    3      1
#4    a    x    4      3
#5    a    y    5      6
#6    b    y    6      7

答案 3 :(得分:0)

我认为这是一个可能的解决方案......

library(dplyr)
largeDF_sample <- sapply(1:nrow(largeDF), function(x) {
    sampleDF_part = filter(sampleDF, colA==largeDF$colA[x] & colB==largeDF$colB[x])
    return(sample(sampleDF_part$sample)[1])
})
largeDF$sample <- largeDF_sample