Bir veri çerçevesini satır bazında ve sütunlara göre nasıl rastgele hale getirebilirim (veya değiştirebilirim)?


98

Bunun gibi bir veri çerçevem ​​(df1) var.

     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 sütunu satır adıdır, f1 ... f5 satırı sütun adıdır.

Örnek (df1) yapmak için, df1 ile aynı 1 numaralı yeni bir veri çerçevesi alıyorum. Dolayısıyla, 1 sayısı tüm veri çerçevesi için korunur, ancak her satır veya sütun için korunmaz.

Randomizasyonu satır bazında veya sütun bazında yapmak mümkün mü?

Her sütun için df1 sütununu rasgele sıralamak istiyorum, yani her sütundaki 1 sayısı aynı kalır. ve her sütunun en az bir kez değiştirilmesi gerekir. Örneğin, şunun gibi rastgele bir df2'ye sahip olabilirim: (Her sütundaki 1 sayısının aynı kaldığını ancak her satırdaki 1 sayısının farklı olduğunu kaydetti.

     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

Aynı şekilde, df1'i her satır için rasgele sıralamak istiyorum, yani no. Her satırdaki 1 sayısı aynı kalır ve her satırın değiştirilmesi gerekir (ancak değiştirilen girişlerin sayısı farklı olabilir). Örneğin, rastgele bir df3 şuna benzer bir şey olabilir:

     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

PS. Gavin Simpson, Joris Meys ve Chase'den iki sütunun rastgele seçilmesi hakkındaki önceki soruma verdiğim önceki cevaplar için çok teşekkürler.


Eğer satır hem permüte istiyorsun ve aynı zamanda sütunları. Bunu yeniden okuduktan sonra, sütun kısıtlaması (her sütunda aynı sayıda 1) ikinci örneğinizde satırlara izin vermiyor gibi görünüyor.
Gavin Simpson

1
Lütfen birden fazla hesaba kaydolmayın. Moderatörlerden burada kullandığınız hesabı önceki Q.'da kullandığınız hesapla birleştirmelerini istedim
Gavin Simpson

Yanıtlar:


236

R data.frame göz önüne alındığında:

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

Satır bazında karıştır:

> 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

Varsayılan sample()olarak, ilk bağımsız değişken olarak iletilen öğeleri rasgele yeniden sıralar. Bu, varsayılan boyutun geçirilen dizinin boyutu olduğu anlamına gelir. Örneklemenin değiştirilmeden yapılmasını replace=FALSEsağlamak için parametre aktarımı (varsayılan), sample(...)bu da satır bazında karıştırma gerçekleştirir.

Sütun bazında karıştır:

> 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
Bunun en iyi yorum olmaması komik, ama yine de gidip başka bir paket hakkında bilgi almaktan daha kolay. Bu, permütasyonla ilgili hemen hemen her soru için doğrudur. SADECE ÖRNEK KULLANIN ()!
Brash Equilibrium

Bu yöntemin row.names'i koruyacağını varsaymakta haklı mıyım?
tumultous_rooster

Bu durumda = standardın üzerinde <- kullanmak için herhangi bir neden var mı?
Christian

4
Bu, satırların ve sütunların sırasını değiştiriyor, ancak OP'nin istediği şey farklı: her bir sütunu / satırı bağımsız olarak karıştır
JelenaČuklina

tam olarak ihtiyacım olan şey!
ChuckCottrill

19

Bu, kullanım data.framepaketini karıştırmanın başka bir yoludur dplyr:

satır bazında:

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

veya

df2 <- sample_frac(df1, 1L)

sütun bazında:

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

10

Bir göz atın permatswap()içinde vegan pakette. Burada hem satır hem de sütun toplamlarını tutan bir örnek verilmiştir, ancak bunu gevşetebilir ve satır veya sütun toplamlarından yalnızca birini düzeltebilirsiniz.

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")

Bu şunu verir:

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

Aramayı açıklamak için:

out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
  1. times istediğiniz rastgele matris sayısıdır, burada 99
  2. burninrastgele numuneler almaya başlamadan önce yapılan takas sayısıdır. Bu, rasgele matrislerimizin her birini almaya başlamadan önce örneklediğimiz matrisin oldukça rastgele olmasını sağlar.
  3. thinher thintakasta sadece rastgele bir çekiliş yapılacağını söylüyor
  4. mtype = "prab" matrisi mevcudiyet / yokluk, yani ikili 0/1 verisi olarak ele alır.

Unutulmaması gereken birkaç nokta, bu herhangi bir sütun veya satırın rastgele hale getirildiğini garanti etmez, ancak burninyeterince uzunsa, bunun olması için iyi bir şans olmalıdır. Ayrıca, ihtiyacınız olandan daha fazla rastgele matris çizebilir ve tüm gereksinimlerinize uymayanları atabilirsiniz.

Her satır için farklı sayıda değişiklik yapma gereksiniminiz de burada ele alınmaz. Yine istediğinizden daha fazla matrisi örnekleyebilir ve ardından bu gereksinimi karşılamayanları da atabilirsiniz.


6

randomizeMatrixR paketindeki işlevi de kullanabilirsinizpicante

misal:

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
> 

Seçenek null.model="frequency", sütun toplamlarını ve richnesssatır toplamlarını korur. Topluluk ekolojisindeki türlerin varlığı yokluğu veri setlerini rastgele hale getirmek için kullanılsa da, burada iyi çalışıyor.

Bu işlevin başka boş model seçenekleri de vardır, dokümantasyonun daha fazla detayı (sayfa 36) için aşağıdaki bağlantıya bakın picante


4

Elbette her satırı örnekleyebilirsiniz:

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

satırları karıştıracak, böylece 1her satırdaki 'lerin sayısı değişmeyecek. Küçük değişiklikler ve sütunlarla da harika çalışıyor, ancak bu okuyucu için bir alıştırmadır :-P


2
Bunda, OP'nin empoze etmek istediği kısıtlamaları uygulamaya çalışan hiçbir şey yoktur.
Gavin Simpson

2

Ayrıca veri çerçevenizdeki aynı sayıda öğeyi aşağıdaki gibi "örnekleyebilirsiniz":

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

yerine dim(M)[1], kullanabileceğiniz nrow(M)tüm prosedürü tek astar haline gelmesi için:random_M <- M[nrow(M),]
Çevik Bean

1

Amaç her bir sütunu rastgele karıştırmaksa, sütunlar birlikte karıştırıldığı için yukarıdaki yanıtlardan bazıları işe yaramaz (bu, sütunlar arası korelasyonları korur). Diğerleri bir paket yüklemeyi gerektirir. Yine de bir tek satır var:

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

0

Bir veri çerçevesindeki Rastgele Örnekler ve Permütasyonlar Matris formundaysa veriye dönüştürün. Çerçeve temel paket indekslerinden örnek işlevi kullanın = örnek (1: nrow (df1), size = 1 * nrow (df1)) Rastgele Örnekler ve Permütasyonlar

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.