2013-02-22 12 views
10

Powiązane z pytaniem this.Losowe próbkowanie procentowej liczby wierszy w ramce danych

gender <- c("F", "M", "M", "F", "F", "M", "F", "F") 
age <- c(23, 25, 27, 29, 31, 33, 35, 37) 
mydf <- data.frame(gender, age) 

mydf[ sample(which(mydf$gender=='F'), 3), ] 

Zamiast wybierania liczby wierszy (3 w powyższym przypadku), jak mogę wybrać losowo 20% wierszy z „F”? A więc z pięciu wierszy z "F", w jaki sposób losowo próbka 20% z tych wierszy.

Odpowiedz

11

Jak o tym:

mydf[ sample(which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ] 

Gdzie 0,2 to 20%, a length(which(mydf$gender=='F')) jest całkowita liczba wierszy z F

+2

+1, ale nie przeszkadza, że ​​20% może być coś innego niż liczba całkowita, więc potrzebna byłaby runda. –

+1

Dobra robota, dzięki, dodałem, że w. Przy okazji, brakuje ci przecinka i zamkniętego nawiasu kwadratu w swojej odpowiedzi – Ben

1

Do próbki 20%, można to wykorzystać, aby uzyskać wielkość próby:

n = round(0.2 * nrow(mydf[mydf$gender == "F",])) 
+0

Tak, udało mi się to zrobić, ale jest to plik zautomatyzowany i uruchamiany co godzinę więc tak naprawdę nie mogę wejść i dostosować wartości bez pisania innej funkcji w/if instrukcji else. Pomyśleliśmy, że będzie prostsze podejście – ATMathew

+3

To jest dokładnie odpowiedź na twoje pytanie. Jeśli twoje pytanie jest inne, edytuj je bardziej szczegółowo. –

+0

Czy ktoś chciałby wypowiedzieć się na temat sprawy? Ta odpowiedź dokładnie odpowiada na pytanie. –

2

Powiadomienie o autorze promocji. Napisałem funkcję, która umożliwia wygodne próbkowanie warstwowe. Przed próbkowaniem dodałem opcję do poziomów podzbiorów ze zmiennych grupujących.

Funkcja nazywa stratified i może być stosowany w następujących sposobów:

set.seed(1) 
# Proportional sample 
stratified(mydf, group="gender", size=.2, select=list(gender = "F")) 
# gender age 
# 4  F 29 
# Fixed-size sampling 
stratified(mydf, group="gender", size=2, select=list(gender = "F")) 
# gender age 
# 4  F 29 
# 5  F 31 

Można określić wiele grup (na przykład, jeśli ramka danych zawiera zmienną „państwo” i chciał grupy przez " stan "i" płeć "należy podać: group = c("state", "gender")). Możesz również podać wiele argumentów "wybierz" (na przykład, jeśli chcesz tylko kobiety z Kalifornii i Teksasu, a zmienna "stan" używa dwuliterowych skrótów stanu, możesz podać select = list(gender = "F", state = c("CA", "TX"))).

Sama funkcja można znaleźć here lub można pobrać i zainstalować pakiet (który daje wygodny dostęp do stron pomocy i przykłady) za pomocą install_github z „DevTools” pakietu w następujący sposób:

# install.packages("devtools") 
library(devtools) 
install_github("mrdwabmisc", "mrdwab") 
5

Można użyć funkcji sample_frac() w pakiecie dplyr.

np. Jeśli chcesz spróbować 20% w każdej grupie:

mydf %>% sample_frac(.2) 

Jeśli chcesz spróbować 20% w każdej grupie Płeć:

mydf %>% group_by(gender) %>% sample_frac(.2) 
Powiązane problemy