Mam taką ramkę danych (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
Kolumna d1 ... d4 to nazwa kolumny, a wiersz f1 ... f5 to nazwa kolumny.
Aby zrobić próbkę (df1), otrzymuję nową ramkę danych z liczbą 1 taką samą jak df1. Tak więc liczba 1 jest zachowywana dla całej ramki danych, ale nie dla każdego wiersza lub każdej kolumny.
Czy można przeprowadzić randomizację według wierszy lub kolumn?
Chcę randomizować kolumny df1 dla każdej kolumny, tj. Liczba 1 w każdej kolumnie pozostaje taka sama. i każda kolumna musi zostać zmieniona co najmniej raz. Na przykład mogę mieć losowe df2 w ten sposób: (Zauważyłem, że liczba 1 w każdej kolumnie pozostaje taka sama, ale liczba 1 w każdym wierszu jest inna.
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
Podobnie, chcę również losować wiersze df1 dla każdego wiersza, tj. Nie. 1 w każdym wierszu pozostaje taka sama i każdy wiersz musi zostać zmieniony (ale liczba zmienionych wpisów może być inna). Na przykład losowy plik df3 może wyglądać mniej więcej tak:
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. Wielkie dzięki za pomoc Gavina Simpsona, Jorisa Meysa i Chase'a za poprzednie odpowiedzi na moje poprzednie pytanie dotyczące losowania dwóch kolumn.
źródło
Odpowiedzi:
Biorąc pod uwagę R data.frame:
Tasuj wierszami:
Domyślnie
sample()
losowo zmienia kolejność elementów przekazanych jako pierwszy argument. Oznacza to, że domyślny rozmiar to rozmiar przekazanej tablicy. Przekazywanie parametrureplace=FALSE
(wartość domyślna) w celusample(...)
zapewnienia, że próbkowanie jest wykonywane bez zamiany, co powoduje przetasowanie wierszy.Pomieszaj według kolumn:
źródło
Oto kolejny sposób na przetasowanie
data.frame
pakietu usingdplyr
:wierszowo:
lub
kolumnowo:
źródło
Przyjrzeć się
permatswap()
w wegańskiej opakowaniu. Oto przykład utrzymujący sumy wierszy i kolumn, ale możesz to złagodzić i naprawić tylko jedną sumę wierszy lub kolumn.To daje:
Aby wyjaśnić wezwanie:
times
to liczba losowych macierzy, które chcesz, tutaj 99burnin
to liczba swapów dokonanych przed rozpoczęciem pobierania próbek losowych. Dzięki temu macierz, z której próbujemy, jest dość losowa, zanim zaczniemy pobierać każdą z naszych losowych macierzythin
mówi tylko losowe losowanie każdejthin
zamianymtype = "prab"
mówi traktuj macierz jako obecność / brak, czyli dane binarne 0/1.Kilka rzeczy do zapamiętania, to nie gwarantuje, że jakakolwiek kolumna lub wiersz został losowy, ale jeśli
burnin
jest wystarczająco długi, powinna istnieć duża szansa, że tak się stanie. Możesz także narysować więcej losowych macierzy niż potrzebujesz i odrzucić te, które nie spełniają wszystkich Twoich wymagań.Twój wymóg posiadania różnej liczby zmian w wierszu również nie jest tutaj uwzględniony. Ponownie możesz próbkować więcej macierzy niż chcesz, a następnie odrzucić te, które również nie spełniają tego wymagania.
źródło
możesz także użyć
randomizeMatrix
funkcji z pakietu R.picante
przykład:
Ta opcja
null.model="frequency"
zachowuje sumy kolumn irichness
sumy wierszy. Chociaż jest używany głównie do randomizacji zbiorów danych o nieobecności gatunków w ekologii społeczności, sprawdza się tutaj dobrze.Ta funkcja ma również inne opcje modelu zerowego, sprawdź poniższe łącze, aby uzyskać więcej informacji (strona 36) w dokumentacji
picante
źródło
Oczywiście możesz próbkować każdy wiersz:
sam potasuje wiersze, więc liczba
1
w każdym wierszu się nie zmieni. Drobne zmiany i świetnie też działa z kolumnami, ale to jest ćwiczenie dla czytelnika :-Pźródło
Możesz także „próbkować” tę samą liczbę elementów w ramce danych za pomocą czegoś takiego:
źródło
dim(M)[1]
możesz użyć,nrow(M)
aby cała procedura stała się jedną linijką:random_M <- M[nrow(M),]
Jeśli celem jest losowe tasowanie każdej kolumny, niektóre z powyższych odpowiedzi nie działają, ponieważ kolumny są tasowane łącznie (zachowuje to korelacje międzykolumnowe). Inne wymagają zainstalowania pakietu. Jednak istnieje jedna linijka:
źródło
Próbki losowe i permutacje w ramce danych Jeśli jest w postaci macierzy, przekonwertuj ją na dane.frame użyj funkcji próbki z pakietu podstawowego indeksy = sample (1: nrow (df1), size = 1 * nrow (df1)) Random Samples and Permutations
źródło