ডেটাফ্রেমে র্যান্ডম সারিগুলির নমুনা


333

আমি উপযুক্ত ফাংশনটি খুঁজতে লড়াই করছি যেটি আর ভাষায় কোনও ডেটা ফ্রেম থেকে প্রতিস্থাপন না করে এলোমেলোভাবে বেছে নেওয়া সারিগুলির নির্দিষ্ট সংখ্যক ফিরিয়ে দেবে? যে কেউ আমাকে সাহায্য করতে পারেন?

উত্তর:


445

প্রথমে কিছু তথ্য তৈরি করুন:

> 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

তারপরে এলোমেলোভাবে কয়েকটি সারি নির্বাচন করুন:

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

4
@ নিখিল এখানে এবং এখানে শুরুর জন্য দেখুন । ?sampleসেই ফাংশনটি পড়ার জন্য আপনি আর কনসোলেও টাইপ করতে পারেন ।
জোরান

10
কেউ ব্যাখ্যা করতে পারেন কেন নমুনা (ডিএফ, 3) কাজ করে না? আপনার কেন ডিএফ [নমুনা (নরো (ডিএফ), 3),] দরকার?
stackoverflowuser2010 8

5
@ stackoverflowuser2010, আপনি? নমুনা টাইপ করতে পারেন এবং দেখুন যে নমুনা ফাংশনে প্রথম যুক্তিটি ভেক্টর বা ধনাত্মক পূর্ণসংখ্যার হতে হবে। আমি মনে করি না যে কোনও ডেটা.ফ্রেম এই ক্ষেত্রে ভেক্টর হিসাবে কাজ করে।
ডেভিড ব্রাউন

9
আপনার set.seed(42)নির্দিষ্ট পরিমাণের নমুনাটি পুনরুত্পাদন করতে প্রতিবার আপনার বীজ (যেমন ) সেট করতে ভুলবেন না।
কাজিনকোকেইন

2
sample.intআমি বিশ্বাস করি কিছুটা দ্রুত হবে:library(microbenchmark);microbenchmark( sample( 10000, 100 ), sample.int( 10000, 100 ), times = 10000 )
এরি বি ফ্রিডম্যান

199

জন কলবি যে উত্তর দেয় তা হ'ল সঠিক উত্তর। তবে আপনি যদি dplyrব্যবহারকারী হন তবে উত্তরটিও রয়েছে sample_n:

sample_n(df, 10)

এলোমেলোভাবে ডেটা ফ্রেম থেকে 10 টি সারি নমুনা। এটি কল করে sample.int, তাই সত্যই কম টাইপিংয়ের সাথে একই উত্তর (এবং ম্যাজিটারের প্রসঙ্গে ব্যবহার সহজ করে তোলে যেহেতু ডেটাফ্রেমটি প্রথম যুক্তি is


মনে রাখবেন যে sample_nকেবলমাত্র কাজ করেtbl of data
ডিজেভি

33

একটি লিখুন! জেসির উত্তর মোড়ানো আমাকে দেয়:

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

এখন প্রথমে n <= nrow (df) পরীক্ষা করে এবং একটি ত্রুটি সহ বন্ধ করে এটি আরও ভাল করুন।


33

data.tableপ্যাকেজ ফাংশন প্রদান করে DT[sample(.N, M)]ডেটা টেবিল থেকে স্যাম্পলিং এম র্যান্ডম সারি, 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

কেবল সম্পূর্ণতার জন্য:

ডিপিপ্লায়ার দ্বারা নমুনার অনুপাত বা ভগ্নাংশ আঁকার প্রস্তাব করে

df %>% sample_frac(0.33)

এটি খুব সুবিধাজনক যেমন মেশিন লার্নিংয়ে আপনাকে যখন একটি নির্দিষ্ট বিভাজন অনুপাত করতে হয় যেমন ৮০%: ২০%


9

সম্পাদনা : এই উত্তরটি এখন পুরানো, আপডেট হওয়া সংস্করণ দেখুন

ইন আমার আর প্যাকেজ আমি উন্নত sampleতাই হিসাবে তথ্য ফ্রেমের জন্য এছাড়াও প্রত্যাশিত এটা এখন আচরণ করবে যে:

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

এই হয় অর্জন করে sampleএকটি এস 3 জেনেরিক পদ্ধতি এবং একটি ফাংশন প্রয়োজনীয় (তুচ্ছ) কার্যকারিতা প্রদানের। setMethodসব কিছু ঠিক করার জন্য একটি কল । মূল বাস্তবায়ন এখনও এর মাধ্যমে অ্যাক্সেস করা যেতে পারে base::sample


1
এর ডেটা ফ্রেমের চিকিত্সা সম্পর্কে অপ্রত্যাশিত কী?
একটি ভিন্ন বেন

2
@ অ্যাডিসেফারবেন: আমি যখন sample.default(df, ...)কোনও ডেটা ফ্রেমের জন্য কল করি তখন dfএটি ডেটা ফ্রেমের কলামগুলি থেকে নমুনাগুলি তৈরি করে, যেমন একটি ডেটা ফ্রেম একই দৈর্ঘ্যের ভেক্টরগুলির তালিকা হিসাবে প্রয়োগ করা হয়।
krlmlr

আপনার প্যাকেজ এখনও উপলব্ধ? আমি দৌড়ে install_github('kimisc', 'krlmlr')এসেছি Error: Does not appear to be an R package (no DESCRIPTION)। কোন পথে?
টেরডন

1
@ জরিসমিজ: "প্রত্যাশিত" অংশ ব্যতীত সম্মত। কোনও ডাটা ফ্রেম অভ্যন্তরীণভাবে তালিকা হিসাবে প্রয়োগ করা হয়েছে, এর অর্থ এই নয় যে এটির মতো আচরণ করা উচিত । [তথ্য ফ্রেমের জন্য অপারেটর একটি counterexample হয়। এছাড়াও, দয়া করে আমাকে বলুন: আপনি কি কখনও sampleএকবারে একবারে ডেটা ফ্রেম থেকে কলামগুলি নমুনার জন্য ব্যবহার করেছেন ?
krlmlr

1
@krlmlr [অপারেটর কাউন্টারিক্স নমুনা নয়: iris[2]তালিকার মতো কাজ করে iris[[2]]। বা iris$Species,, lapply(iris, mean)... ডেটা ফ্রেমগুলির তালিকা। তাই আমিও তাদের মতো আচরণ করার প্রত্যাশা করি। এবং হ্যাঁ, আমি প্রকৃতপক্ষে নমুনা (মাইডাটাফ্রেম) ব্যবহার করেছি। একটি ডেটাসেটে যেখানে প্রতিটি চলকটিতে একটি একক জিনের এক্সপ্রেশন ডেটা থাকে। আপনার সুনির্দিষ্ট পদ্ধতিটি নবীন ব্যবহারকারীদের সহায়তা করে, তবে আচরণের পদ্ধতিটি কার্যকরভাবে পরিবর্তন sample()করে। দ্রষ্টব্য আমি কোনও প্রোগ্রামারের দর্শন থেকে "প্রত্যাশিত হিসাবে" ব্যবহার করি। যা সাধারণ অন্তর্দৃষ্টি থেকে পৃথক। আর তে অনেক কিছুই রয়েছে যা সাধারণ অন্তর্দৃষ্টিগুলির সাথে সামঞ্জস্য নয় ...;)
জরিস মেজ

8

পুরানো উত্তর। দয়া করে dplyr::sample_frac()বা dplyr::sample_n()পরিবর্তে ব্যবহার করুন।

ইন আমার আর প্যাকেজ একটি ফাংশন আছে sample.rowsশুধু এই উদ্দেশ্যে:

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

পূর্ববর্তীsample জরিস মাইসের মন্তব্য অনুসারে জেনেরিক এস 3 ফাংশন তৈরি করে এটি বৃদ্ধি করা একটি খারাপ ধারণা ছিল ।


5

একটি টিবল প্রকার থেকে একটি এলোমেলো নমুনা নির্বাচন করুন আর:

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

নরো একটি টিবল লাগে এবং সারিগুলির সংখ্যা প্রদান করে। প্রথম প্যারামিটারটি পাস করা sampleআপনার টিবলের 1 থেকে শেষ অবধি। দ্বিতীয় প্যারামিটারটি নমুনায় পাস করেছে, 150, আপনি কতটা এলোমেলো নমুনা চান। বর্গাকার বন্ধনী স্লাইসিং সূচকগুলির সারি সুনির্দিষ্ট করে। চলক 'এ' এলোমেলো নমুনার মান পায়।


3

আপনি এটি করতে পারেন:

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

উপরে আমি মাত্র 10 টি কলাম এবং 100 টি সারি দিয়ে একটি ডেটা ফ্রেম তৈরি করেছি, ঠিক আছে?

এখন আপনি এটি দিয়ে নমুনা করতে পারেন 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

আমি আর এ নতুন, তবে আমি এই সহজ পদ্ধতিটি ব্যবহার করছিলাম যা আমার পক্ষে কাজ করে:

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

PS: এটির কিছুটা অসুবিধা থাকলে আমি ভাবছি না তা নির্দ্বিধায় محسوس করুন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.