2017-05-24 89 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