Veri çerçevesinde rastgele satır örnekleri


333

Ben R dilinde bir veri çerçevesinden değiştirmeden rastgele alınan satırları belirtilen sayıda döndürecek uygun işlevi bulmak için mücadele ediyorum? Biri bana yardım edebilir mi?

Yanıtlar:


445

İlk önce bazı veriler yapın:

> df = data.frame(matrix(rnorm(20), nrow=10))
> df
           X1         X2
1   0.7091409 -1.4061361
2  -1.1334614 -0.1973846
3   2.3343391 -0.4385071
4  -0.9040278 -0.6593677
5   0.4180331 -1.2592415
6   0.7572246 -0.5463655
7  -0.8996483  0.4231117
8  -1.0356774 -0.1640883
9  -0.3983045  0.7157506
10 -0.9060305  2.3234110

Ardından rastgele bazı satırları seçin:

> df[sample(nrow(df), 3), ]
           X1         X2
9  -0.3983045  0.7157506
2  -1.1334614 -0.1973846
10 -0.9060305  2.3234110

4
@nikhil Yeni başlayanlar için buraya ve buraya bakın . Bu ?sampleişlev hakkında okumak için R konsoluna da yazabilirsiniz .
joran

10
Birisi numunenin (df, 3) neden çalışmadığını açıklayabilir mi? Neden df [sample (nrow (df), 3),]] 'a ihtiyacınız var?
stackoverflowuser2010

5
@ stackoverflowuser2010,? sample yazabilir ve sample fonksiyonundaki ilk argümanın bir vektör veya pozitif bir tam sayı olması gerektiğini görebilirsiniz. Bu durumda bir data.frame'in vektör olarak çalıştığını düşünmüyorum.
David Braun

9
set.seed(42)Belirli bir örneği her üretmek istediğinizde tohumunuzu (ör. ) Ayarlamayı unutmayın .
CousinCocaine

2
sample.intbiraz daha hızlı olurdu inanıyorum:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
Ari B. Friedman

199

John Colby'nin verdiği cevap doğru cevaptır. Ancak bir dplyrkullanıcıysanız, cevap da vardır sample_n:

sample_n(df, 10)

veri çerçevesinden rastgele 10 satır örnekler. Bu sample.int, gerçekten daha az yazarak aynı cevabı çağırıyor (ve veri çerçevesi ilk argüman olduğu için magrittr bağlamında kullanımı basitleştiriyor).


33

Bir tane yazın! JC'nin cevabını sarmak bana şunları veriyor:

randomRows = function(df,n){
   return(df[sample(nrow(df),n),])
}

Şimdi önce n <= nrow (df) olup olmadığını kontrol ederek ve bir hatayla durdurarak daha iyi hale getirin.


33

data.tablePaket fonksiyonu sağlar DT[sample(.N, M)]veri tablosu M rastgele satır örnekleme DT.

library(data.table)
set.seed(10)

mtcars <- data.table(mtcars)
mtcars[sample(.N, 6)]

    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
1: 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
2: 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
3: 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
4: 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
5: 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
6: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2

10

Sadece bütünlük uğruna:

dplyr ayrıca numunenin bir kısmını veya bir kısmını

df %>% sample_frac(0.33)

Bu, örneğin% 80 gibi belirli bir bölünme oranı yapmanız gerektiğinde makine öğreniminde çok uygundur.


9

EDIT : Bu cevap şimdi güncel değil, güncellenmiş sürüme bakın .

In my R paketin ben arttırmıştır sampleveri çerçevelerinin de beklendiği gibi şimdi davranır böylece:

library(devtools); install_github('kimisc', 'krlmlr')

library(kimisc)
example(sample.data.frame)

smpl..> set.seed(42)

smpl..> sample(data.frame(a=c(1,2,3), b=c(4,5,6),
                           row.names=c('a', 'b', 'c')), 10, replace=TRUE)
    a b
c   3 6
c.1 3 6
a   1 4
c.2 3 6
b   2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6

Bu, bir S3 genel yöntemi yapılarak ve bir işlevde gerekli (önemsiz) işlevselliği sağlayarak elde edilir sample. Her setMethodşeyi düzeltmek için bir çağrı . Orijinal uygulamaya hala erişilebilir base::sample.


1
Veri çerçevelerinin işlenmesi hakkında beklenmedik olan nedir?
farklı bir ben

2
@adifferentben: Bir sample.default(df, ...)veri çerçevesi çağırdığımda , veri çerçevesi aynı uzunluktaki vektörlerin bir listesi olarak uygulandığından, veri çerçevesinin sütunlarındandf örnekler .
krlmlr

Paketiniz hala kullanılabilir mi? Kaçtım install_github('kimisc', 'krlmlr')ve aldım Error: Does not appear to be an R package (no DESCRIPTION). Bunun herhangi bir yolu var mı?
terdon

1
@JorisMeys: "Beklendiği gibi" kısmı hariç kabul etti. Bir veri çerçevesi dahili olarak bir liste olarak uygulandığı için , bunun bir gibi davranması gerektiği anlamına gelmez . [Veri çerçevelerinin operatör karşı-bir. Ayrıca, lütfen söyle: Hiç, sadece bir kez, samplebir veri çerçevesindeki sütunları örneklemek için kullandınız mı?
krlmlr

1
@krlmlr [işleci bir karşı örnek değildir: iris[2]bir liste gibi çalışır iris[[2]]. Veya iris$Species,, lapply(iris, mean)... Veri çerçeveleri listelerdir. Bu yüzden onların onlar gibi davranmasını bekliyorum. Ve evet, aslında örnek (myDataframe) kullandım. Her değişkenin tek bir genin ifade verilerini içerdiği bir veri kümesinde. Özel yönteminiz acemi kullanıcılara yardımcı olur, ancak sample()davranış biçimini etkili bir şekilde değiştirir . Not Bir programcının bakış açısından "beklendiği gibi" kullanıyorum. Hangi genel sezgi farklıdır. R'de genel sezgi ile uyumlu olmayan çok şey var ...;)
Joris Meys

8

Eski cevap. Lütfen dplyr::sample_frac()veya dplyr::sample_n()yerine kullanın.

In my R paketinin bir fonksiyon vardır sample.rowssadece bu amaç için:

install.packages('kimisc')

library(kimisc)
example(sample.rows)

smpl..> set.seed(42)

smpl..> sample.rows(data.frame(a=c(1,2,3), b=c(4,5,6),
                               row.names=c('a', 'b', 'c')), 10, replace=TRUE)
    a b
c   3 6
c.1 3 6
a   1 4
c.2 3 6
b   2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6

Geliştirilmesi samplebir jenerik S3 işlevi yaparak için Joris MEYS yorumlarına göre, kötü bir fikirdi önceki cevabı .


5

R'de bir tibble türünden Rastgele bir örnek seçin:

library("tibble")    
a <- your_tibble[sample(1:nrow(your_tibble), 150),]

nrow bir tibble alır ve satır sayısını döndürür. Aktarılan ilk parametre sample, tibble'ınızın sonuna 1 ila aralığıdır. Numuneye (150) iletilen ikinci parametre, kaç tane rastgele örnekleme istediğinizdir. Köşeli parantez dilimleme, döndürülen dizinlerin satırlarını belirtir. Değişken 'a' rastgele örneklemenin değerini alır.


3

Bunu yapabilirsin:

library(dplyr)

cols <- paste0("a", 1:10)
tab <- matrix(1:1000, nrow = 100) %>% as.tibble() %>% set_names(cols)
tab
# A tibble: 100 x 10
      a1    a2    a3    a4    a5    a6    a7    a8    a9   a10
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1     1   101   201   301   401   501   601   701   801   901
 2     2   102   202   302   402   502   602   702   802   902
 3     3   103   203   303   403   503   603   703   803   903
 4     4   104   204   304   404   504   604   704   804   904
 5     5   105   205   305   405   505   605   705   805   905
 6     6   106   206   306   406   506   606   706   806   906
 7     7   107   207   307   407   507   607   707   807   907
 8     8   108   208   308   408   508   608   708   808   908
 9     9   109   209   309   409   509   609   709   809   909
10    10   110   210   310   410   510   610   710   810   910
# ... with 90 more rows

Yukarıda sadece 10 sütun ve 100 satırlı bir veri çerçevesi yaptım, tamam mı?

Şimdi ile örnekleyebilirsiniz sample_n:

sample_n(tab, size = 800, replace = T)
# A tibble: 800 x 10
      a1    a2    a3    a4    a5    a6    a7    a8    a9   a10
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1    53   153   253   353   453   553   653   753   853   953
 2    14   114   214   314   414   514   614   714   814   914
 3    10   110   210   310   410   510   610   710   810   910
 4    70   170   270   370   470   570   670   770   870   970
 5    36   136   236   336   436   536   636   736   836   936
 6    77   177   277   377   477   577   677   777   877   977
 7    13   113   213   313   413   513   613   713   813   913
 8    58   158   258   358   458   558   658   758   858   958
 9    29   129   229   329   429   529   629   729   829   929
10     3   103   203   303   403   503   603   703   803   903
# ... with 790 more rows

1

R'de yeniyim, ama benim için çalışan bu kolay yöntemi kullanıyordum:

sample_of_diamonds <- diamonds[sample(nrow(diamonds),100),]

Not: Düşünmediğim bir dezavantajı varsa not etmekte özgürsünüz.


0

Bunu yapabilirsin:

sample_data = data[sample(nrow(data), sample_size, replace = FALSE), ]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.