डेटाफ़्रेम रोविज़ और कॉलमवाइज़ को रैंडमाइज़ (या परमिट) कैसे करें?


96

मेरे पास इस तरह का एक डेटाफ्रेम (df1) है।

     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 की संख्या समान रहती है। और प्रत्येक कॉलम को कम से कम एक बार बदलना होगा। उदाहरण के लिए, मेरे पास एक यादृच्छिक df2 हो सकता है जैसे: (ध्यान दिया कि प्रत्येक कॉलम में 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

पुनश्च। गैविन सिम्पसन, जोरिस मेय्स और चेस की मदद के लिए बहुत धन्यवाद दो कॉलमों को यादृच्छिक बनाने पर मेरे पिछले प्रश्न के उत्तर के लिए।


क्या आप एक ही समय में पंक्ति और स्तंभ दोनों को अनुमति देना चाहते हैं । इसे फिर से जोड़ना, यह स्तंभ बाधा की तरह दिखता है (प्रत्येक कॉलम में 1s की संख्या) आपके दूसरे उदाहरण की अनुमति पंक्तियों में नहीं थी।
गैविन सिम्पसन

1
कृपया कई खातों के लिए साइन अप न करें। मैंने मध्यस्थों को आपके द्वारा यहाँ उपयोग किए गए खाते को पिछले Q पर उपयोग किए गए मर्ज करने के लिए कहा है।
गैविन सिम्पसन

जवाबों:


233

R data.frame को देखते हुए:

> 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
खैर, यह पंक्तियों और स्तंभों का क्रम बदल रहा है, लेकिन ओपी जो चाहता था वह अलग है: प्रत्येक कॉलम / पंक्ति को स्वतंत्र रूप से फेरबदल करें
Jelena Febuklina

वास्तव में मुझे क्या चाहिए!
ChuckCottrill

18

यह 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प्रत्येक पंक्ति में संख्या नहीं बदलती है। छोटे परिवर्तन और यह कॉलम के साथ भी बहुत अच्छा है, लेकिन यह पाठक के लिए एक अभ्यास है :-P


2
इसमें कुछ भी ऐसा नहीं है जो ओपी को थोपना चाहेगा।
गैविन सिम्पसन

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

रैंडम नमूने और क्रमपरिवर्तन ina dataframe यदि यह मैट्रिक्स रूप में है तो डेटा में बदल दें। बेस पैकेज अनुक्रमित = नमूना (1: nrow (df1), नमूना = 1 * nrow (df1) से नमूना फ़ंक्शन का उपयोग करें। यादृच्छिक नमूने और क्रमपरिवर्तन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.