কিভাবে একটি ডাটাফ্রেম সারিবদ্ধ এবং কলামওয়াইজ এলোমেলোভাবে (বা অনুমতি দেওয়া)?


98

আমার মতো একটি ডেটাফ্রেম (ডিএফ 1) রয়েছে।

     f1   f2   f3   f4   f5
d1   1    0    1    1    1  
d2   1    0    0    1    0
d3   0    0    0    1    1
d4   0    1    0    0    1

D1 ... d4 কলামটি রওনাম, f1 ... f5 সারিটি কলামের নাম।

নমুনা (df1) করতে, আমি df1 হিসাবে 1 সমান গণনা সহ একটি নতুন ডাটাফ্রেম পাই। সুতরাং, 1 এর গণনা পুরো ডাটাফ্রেমের জন্য সংরক্ষিত তবে প্রতিটি সারি বা প্রতিটি কলামের জন্য নয়।

র্যান্ডমাইজেশন সারি-ভিত্তিক বা কলাম অনুসারে করা কি সম্ভব?

আমি প্রতিটি কলামের জন্য df1 কলাম অনুসারে এলোমেলো করতে চাই, অর্থাত প্রতিটি কলামে 1 এর সংখ্যা একই থাকবে। এবং প্রতিটি কলাম কমপক্ষে একবারে পরিবর্তন করা দরকার। উদাহরণস্বরূপ, আমার এর মতো এলোমেলোভাবে ডিএফ 2 থাকতে পারে: (উল্লেখ্য যে প্রতিটি কলামে 1 এর গণনা একই থাকবে তবে প্রতিটি সারিতে 1 এর গণনা আলাদা।

     f1   f2   f3   f4   f5
d1   1    0    0    0    1  
d2   0    1    0    1    1
d3   1    0    0    1    1
d4   0    0    1    1    0

তেমনি, আমি প্রতিটি সারিটির জন্য, যেমন নং-এর জন্য df1 সারি অনুসারে র্যান্ডমাইজ করতে চাই। প্রতিটি সারিতে 1 এর অবধি একই থাকে এবং প্রতিটি সারি পরিবর্তন করতে হবে (তবে পরিবর্তিত এন্ট্রিগুলির মধ্যে আলাদা আলাদা হতে পারে)। উদাহরণস্বরূপ, একটি এলোমেলোনা df3 এর মতো কিছু হতে পারে:

     f1   f2   f3   f4   f5
d1   0    1    1    1    1  <- two entries are different
d2   0    0    1    0    1  <- four entries are different
d3   1    0    0    0    1  <- two entries are different
d4   0    0    1    0    1  <- two entries are different

পুনশ্চ. গ্যাভিন সিম্পসন, জরিস মেজ এবং চেসের সহায়তার জন্য দু'টি কলামকে এলোমেলো করে দেওয়ার বিষয়ে আমার আগের প্রশ্নের আগের উত্তরগুলির জন্য অনেক ধন্যবাদ।


আপনি কি একই সাথে সারি এবং কলাম উভয়ই স্থির করতে চান want এটি পুনরায় পড়াতে, দেখে মনে হচ্ছে কলাম সীমাবদ্ধতা (প্রতিটি কলামে 1s সমান সংখ্যক) আপনার দ্বিতীয় উদাহরণটিকে সারিগুলি অনুমতি দেয় না।
গ্যাভিন সিম্পসন

4
দয়া করে একাধিক অ্যাকাউন্টের জন্য সাইন আপ করবেন না। আমি মডারেটরদের আপনি এখানে আগের অ্যাকাউন্টে ব্যবহৃত অ্যাকাউন্টটির সাথে অ্যাকাউন্টটি একত্রীকরণ করতে বলেছি
গ্যাভিন সিম্পসন

উত্তর:


236

আর ডেটা দেওয়া হয়েছে Give ফ্রেম:

> df1
  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0

সারি অনুসারে পরিবর্তন:

> df2 <- df1[sample(nrow(df1)),]
> df2
  a b c
3 0 1 0
4 0 0 0
2 1 0 0
1 1 1 0

ডিফল্টরূপে sample()প্রথম আর্গুমেন্ট হিসাবে এলোমেলোভাবে উপাদানগুলিকে পুনরায় সাজিয়ে তোলে। এর অর্থ হ'ল ডিফল্ট আকারটি পাস হওয়া অ্যারের আকার। পরামিতি replace=FALSE(ডিফল্ট) পাস করার বিষয়টি sample(...)নিশ্চিত করে যে স্যাম্পলিং প্রতিস্থাপন ছাড়াই সম্পন্ন হয়েছে যা একটি সারিতে বুদ্ধিমান সাফল্য অর্জন করে।

কলাম অনুসারে পরিবর্তন করুন:

> df3 <- df1[,sample(ncol(df1))]
> df3
  c a b
1 0 1 1
2 0 1 0
3 0 0 1
4 0 0 0

5
আমি মনে করি এটি মজার বিষয় কীভাবে এটি শীর্ষ মন্তব্য নয়, এবং এটি অন্য কিছু প্যাকেজ সম্পর্কে জানতে এবং শেখার চেয়ে সহজ। অনুমতি দেওয়ার প্রায় কোনও প্রশ্নের ক্ষেত্রে এটি সত্য। শুধু নমুনা ব্যবহার করুন ()!
ব্রাশ ভারসাম্য

আমি কি এই পদ্ধতিটি সারি.নামগুলি বজায় রাখব তা অনুমান করে সঠিক?
tumultous_rooster

এই ক্ষেত্রে = মানের উপরে <ব্যবহার করার কোনও কারণ?
খ্রিস্টান

4
ঠিক আছে, এটি সারি এবং কলামগুলির ক্রম পরিবর্তন করছে, তবে ওপি যা চেয়েছিল তা অন্যরকম: প্রতিটি কলাম / সারিটি স্বতন্ত্রভাবে
বদলে ফেলুন

ঠিক আমার যা দরকার!
চককট্রিল

19

এটি data.frameব্যবহারের প্যাকেজটি বদল করার অন্য উপায় dplyr:

সারি অনুসারে:

df2 <- slice(df1, sample(1:n()))

বা

df2 <- sample_frac(df1, 1L)

কলাম অনুসারে:

df2 <- select(df1, one_of(sample(names(df1)))) 

10

কটাক্ষপাত permatswap()মধ্যে ভেজান প্যাকেজ। এখানে সারি এবং কলামের মোট উভয়ই বজায় রাখার একটি উদাহরণ রয়েছে তবে আপনি এটি শিথিল করতে পারেন এবং কেবলমাত্র সারি বা কলামের যোগফলগুলি ঠিক করতে পারেন।

mat <- matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1), ncol = 5)
set.seed(4)
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")

এটি দেয়:

R> out$perm[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    1
[2,]    0    1    0    1    0
[3,]    0    0    0    1    1
[4,]    1    0    0    0    1
R> out$perm[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    1    1
[2,]    0    0    0    1    1
[3,]    1    0    0    1    0
[4,]    0    0    1    0    1

কলটি ব্যাখ্যা করতে:

out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
  1. times আপনি চান এলোমেলোভাবে ম্যাট্রিকের সংখ্যা, এখানে 99
  2. burninআমরা এলোমেলো নমুনা নেওয়া শুরু করার আগে তৈরি হওয়া অদলবদলের সংখ্যা। এটি আমাদের প্রতিটি এলোমেলো ম্যাট্রিক্স নেওয়া শুরু করার আগে ম্যাট্রিক্সটিকে আমরা একেবারে এলোমেলোভাবে নমুনা দেয়
  3. thinবলে যে প্রতিটি thinঅদলবদলকে এলোমেলোভাবে আঁকুন
  4. mtype = "prab" বলে ম্যাট্রিক্সকে উপস্থিতি / অনুপস্থিতি হিসাবে ধরা যাক, বাইনারি 0/1 ডেটা।

কয়েকটি বিষয় লক্ষণীয়, এটি কোনও গ্যারান্টি দেয় না যে কোনও কলাম বা সারি এলোমেলোভাবে করা হয়েছে, তবে যদি burninযথেষ্ট দীর্ঘ হয় তবে এটি হওয়ার একটি ভাল সুযোগ থাকা উচিত। এছাড়াও, আপনি আপনার প্রয়োজনের তুলনায় আরও এলোমেলো ম্যাট্রিকগুলি আঁকতে পারেন এবং আপনার সমস্ত প্রয়োজনীয়তার সাথে মেলে না এমনগুলি ফেলে দিতে পারেন।

আপনার প্রতি সারিতে বিভিন্ন সংখ্যক পরিবর্তন হওয়া দরকার, এটিও এখানে আচ্ছাদিত নয়। আবার আপনি নিজের চেয়ে বেশি ম্যাট্রিক পরীক্ষা করতে পারেন এবং তারপরে এই প্রয়োজনীয়তাটি পূরণ করেন না এমনগুলিও ফেলে দিতে পারেন।


6

আপনি এটি ব্যবহার করতে পারেন randomizeMatrix আর প্যাকেজে ফাংশনটিpicante

উদাহরণ:

test <- matrix(c(1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0),nrow=4,ncol=4)
> test
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    0
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "frequency",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    0    1    0    1
[2,]    1    0    0    0
[3,]    1    0    1    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "richness",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    1    0    0    1
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0
> 

বিকল্পটি null.model="frequency"কলামের পরিমাণগুলি richnessবজায় রাখে এবং সারি অঙ্কগুলি বজায় করে। যদিও প্রধানত সম্প্রদায় বাস্তুবিদ্যায় প্রজাতির উপস্থিতি অনুপস্থিত ডেটাসেটগুলির জন্য এটিকে এখানে ভালভাবে কাজ করে।

এই ফাংশনে অন্যান্য নাল মডেল বিকল্পগুলিও রয়েছে, ডকুমেন্টেশনের আরও বিশদ (পৃষ্ঠা 36) এর জন্য নিম্নলিখিত লিঙ্কটি দেখুন picante


4

অবশ্যই আপনি প্রতিটি সারি নমুনা করতে পারেন:

sapply (1:4, function (row) df1[row,]<<-sample(df1[row,]))

সারিগুলি নিজেই 1বদলে যাবে, সুতরাং প্রতিটি সারিতে সংখ্যার পরিবর্তন হয় না। ছোট পরিবর্তন এবং এটি কলামগুলির সাথেও দুর্দান্ত কাজ করে তবে এটি পাঠকের জন্য অনুশীলন :- পি


4
ওপি চাপিয়ে দিতে চাইবে এমন প্রতিবন্ধকতাগুলি কার্যকর করার চেষ্টা করে এমন কিছুই নেই।
গ্যাভিন সিম্পসন

2

আপনি এই জাতীয় কিছু দিয়ে আপনার ডেটা ফ্রেমে একই সংখ্যক আইটেম "নমুনা" দিতে পারেন:

nr<-dim(M)[1]
random_M = M[sample.int(nr),]

পরিবর্তে dim(M)[1], আপনি ব্যবহার করতে পারেন nrow(M)যাতে পুরো পদ্ধতিটি এক-লাইনারে পরিণত হয়:random_M <- M[nrow(M),]
চটপটি বিন

1

যদি লক্ষ্যটি প্রতিটি কলামকে এলোমেলোভাবে বদলানো হয় তবে কলামগুলি যৌথভাবে পরিবর্তিত হওয়ায় উপরের কিছু উত্তর কার্যকর হবে না (এটি আন্তঃ কলামের সম্পর্ককে সংরক্ষণ করে)। অন্যদের একটি প্যাকেজ ইনস্টল করা প্রয়োজন। তবুও একটি ওয়ান-লাইনার বিদ্যমান:

df2 = lapply(df1, function(x) { sample(x) })

0

এলোমেলো নমুনা এবং অনুমতি ইনটা ডেটাফ্রেম যদি ম্যাট্রিক্স ফর্মে থাকে তবে ডেটাতে রূপান্তর করুন ra ফ্রেম বেস প্যাকেজ সূচী = নমুনা (1: নরো (ডিএফ 1), আকার = 1 * ন্রো (ডিএফ 1)) র্যান্ডম নমুনা এবং অনুমতিগুলি ব্যবহার করুন

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