2017-01-17 54 views
-3

我已經根據各種條件創建了多個數據幀。現在我想要對不同的數據幀進行採樣,但是我希望在採樣後刪除這些行。我曾嘗試dplyrs sample_n:從數據幀陣列中隨機抽樣

sample_n(df, 4) 

的問題是,這不會刪除線,我需要一些遞歸循環,將刪除該線一旦被採樣?還是有一些方便的功能可以幫助我?

+0

請提供一個小的可重複的例子和預期產出 – akrun

+1

有一個看看'modelr'包的tidyverse方法。 – Axeman

+0

@akrun同樣的問題沒有被問到。我不僅想要對數據幀進行採樣,而且需要在採樣後續時間時再次對相同的數據進行採樣。 – Lowpar

回答

6

適合我。

# generate data 
a <- data.frame(letters = letters[1:5], var = rnorm(5)) 
b <- data.frame(letters = letters[6:10], var = rnorm(5)) 
c <- data.frame(letters = letters[11:15], var = rnorm(5)) 
xy <- list(a, b, c) 

set.seed(357) # set seed for reproducibility 
dfsample <- sample(seq_len(length(xy)), 1) # sample out one data.frame 

xy[[dfsample]] 

    letters   var 
1  a 1.51348192 
2  b -0.60657737 
3  c 0.51828252 
4  d -0.05352487 
5  e -1.34303266 

# remove random row, notice the minus sign in front of the sample 
xy[[dfsample]] <- xy[[dfsample]][-sample(1:nrow(xy[[dfsample]]), 1), ] 
xy[[dfsample]] 

    letters   var 
2  b -0.60657737 
3  c 0.51828252 
4  d -0.05352487 
5  e -1.34303266 
+0

'seq_len(length(xy))'而不是'seq_along(xy)'的任何特定原因? – Axeman

+0

偉大的迴應,確實可以實現這個遞歸函數,非常感謝您的幫助! – Lowpar

+1

@Axeman我很少關注那部分,所以沒有特別的理由。 –

0
modelr::crossv_mc(mtcars, 5, 0.5) 

創建5套相同大小的獨佔分割的。它們存儲爲列表列,並使用resample類,這是有效的內存。

# A tibble: 5 × 3 
      train   test .id 
      <list>   <list> <chr> 
1 <S3: resample> <S3: resample>  1 
2 <S3: resample> <S3: resample>  2 
3 <S3: resample> <S3: resample>  3 
4 <S3: resample> <S3: resample>  4 
5 <S3: resample> <S3: resample>  5