2017-05-24 56 views
1

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

我再要一个新的列添加到samplelargeDF,这是sampleDFsample列的colAcolB适当的子集的随机样本。

例如,对于第一行的值是ax,因此该值将是12随机抽样,对下一行(by)这将是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 

任何帮助,将不胜感激!

+0

什么是colA'和'colB'值和采样域({1,2}和{'之间的确切关系6,7. 8. 9. 10}在你的例子中)? – Pop

回答

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 
0

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

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 
+0

这是否解决您的问题? –

1

你可以做这样的事情:

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