【问题标题】:Get random sample from subset of other dataframe从其他数据帧的子集中获取随机样本
【发布时间】:2017-05-24 14:25:03
【问题描述】:

我有一个包含 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)

然后我想在largeDF 中添加一个新列sample,这是sampleDF 中sample 列的随机样本,用于colA 和colB 的适当子集。

例如,对于第一行,值为a 和x,因此对于下一行(b 和y,该值将是1 或2 的随机样本) 这将是6, 7, 8, 9 or 10 的随机样本。

所以我们可以得到类似的结果:

  rowA rowB rowC sample
1    a    x    1      2
2    b    y    2      9
3    b    y    3      7
4    a    x    4      2
5    a    y    5      4
6    b    y    6      8

任何帮助将不胜感激!

【问题讨论】:

  • colA 和 colB 值与采样域(在您的示例中为 {1, 2} 和​​ {6, 7. 8. 9. 10})之间的确切关系是什么?

标签: r dataframe subset


【解决方案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

【讨论】:

    【解决方案2】:

    你可以这样做:

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

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        【解决方案4】:

        我认为这对你来说是一种可能的解决方案......

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-31
          • 1970-01-01
          • 1970-01-01
          • 2022-05-21
          • 1970-01-01
          • 1970-01-01
          • 2015-08-22
          相关资源
          最近更新 更多