Ik heb moeite om de juiste functie te vinden die een bepaald aantal willekeurig opgehaalde rijen zou retourneren zonder vervanging van een dataframe in R-taal? Kan iemand me helpen?
Antwoord 1, autoriteit 100%
Maak eerst wat gegevens:
> df = data.frame(matrix(rnorm(20), nrow=10))
> df
X1 X2
1 0.7091409 -1.4061361
2 -1.1334614 -0.1973846
3 2.3343391 -0.4385071
4 -0.9040278 -0.6593677
5 0.4180331 -1.2592415
6 0.7572246 -0.5463655
7 -0.8996483 0.4231117
8 -1.0356774 -0.1640883
9 -0.3983045 0.7157506
10 -0.9060305 2.3234110
Selecteer vervolgens willekeurig enkele rijen:
> df[sample(nrow(df), 3), ]
X1 X2
9 -0.3983045 0.7157506
2 -1.1334614 -0.1973846
10 -0.9060305 2.3234110
Antwoord 2, autoriteit 48%
Het antwoord dat John Colby geeft, is het juiste antwoord. Als u echter een dplyr
-gebruiker bent, is er ook het antwoord sample_n
:
sample_n(df, 10)
steek willekeurig 10 rijen uit het dataframe op. Het roept sample.int
aan, dus eigenlijk hetzelfde antwoord met minder typen (en vereenvoudigt het gebruik in de context van magrittr aangezien het dataframe het eerste argument is).
Antwoord 3, autoriteit 8%
Het pakket data.table
biedt de functie DT[sample(.N, M)]
, waarbij M willekeurige rijen worden bemonsterd uit de gegevenstabel DT
.
library(data.table)
set.seed(10)
mtcars <- data.table(mtcars)
mtcars[sample(.N, 6)]
mpg cyl disp hp drat wt qsec vs am gear carb
1: 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
2: 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
3: 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
4: 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
5: 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
6: 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
Antwoord 4, autoriteit 7%
Schrijf er een! Het antwoord van JC inpakken geeft me:
randomRows = function(df,n){
return(df[sample(nrow(df),n),])
}
Maak het nu beter door eerst te controleren of n<=nrow(df) en te stoppen met een fout.
Antwoord 5, autoriteit 3%
Voor de volledigheid:
dplyr biedt ook aan om een deel of fractie van het monster te tekenen door
df %>% sample_frac(0.33)
Dit is erg handig, b.v. in machine learning wanneer je een bepaalde splitsingsverhouding moet doen, zoals 80%:20%
Antwoord 6, autoriteit 2%
BEWERKEN: dit antwoord is nu verouderd, zie de bijgewerkte versie.
In mijn R-pakketheb ik sample
verbeterd zodat het gedraagt zich nu ook zoals verwacht voor dataframes:
library(devtools); install_github('kimisc', 'krlmlr')
library(kimisc)
example(sample.data.frame)
smpl..> set.seed(42)
smpl..> sample(data.frame(a=c(1,2,3), b=c(4,5,6),
row.names=c('a', 'b', 'c')), 10, replace=TRUE)
a b
c 3 6
c.1 3 6
a 1 4
c.2 3 6
b 2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6
Dit is bereiktdoor sample
een S3 generieke methode en het voorzien van de nodige (triviale) functionaliteit in een functie. Een aanroep van setMethod
lost alles op. De originele implementatie is nog steeds toegankelijk via base::sample
.
Antwoord 7, autoriteit 2%
Verouderd antwoord. Gebruik in plaats daarvan
dplyr::sample_frac()
ofdplyr::sample_n()
.
In mijn R-pakketis er een functie sample.rows
alleen voor dit doel:
install.packages('kimisc')
library(kimisc)
example(sample.rows)
smpl..> set.seed(42)
smpl..> sample.rows(data.frame(a=c(1,2,3), b=c(4,5,6),
row.names=c('a', 'b', 'c')), 10, replace=TRUE)
a b
c 3 6
c.1 3 6
a 1 4
c.2 3 6
b 2 5
b.1 2 5
c.3 3 6
a.1 1 4
b.2 2 5
c.4 3 6
Het verbeteren van sample
door er een generieke S3-functie van te maken was een slecht idee, volgens opmerkingen van Joris Meys op een vorige antwoord.
Antwoord 8, autoriteit 2%
Je zou dit kunnen doen:
library(dplyr)
cols <- paste0("a", 1:10)
tab <- matrix(1:1000, nrow = 100) %>% as.tibble() %>% set_names(cols)
tab
# A tibble: 100 x 10
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 1 101 201 301 401 501 601 701 801 901
2 2 102 202 302 402 502 602 702 802 902
3 3 103 203 303 403 503 603 703 803 903
4 4 104 204 304 404 504 604 704 804 904
5 5 105 205 305 405 505 605 705 805 905
6 6 106 206 306 406 506 606 706 806 906
7 7 107 207 307 407 507 607 707 807 907
8 8 108 208 308 408 508 608 708 808 908
9 9 109 209 309 409 509 609 709 809 909
10 10 110 210 310 410 510 610 710 810 910
# ... with 90 more rows
Hierboven heb ik zojuist een dataframe gemaakt met 10 kolommen en 100 rijen, oké?
Je kunt het nu samplen met sample_n
:
sample_n(tab, size = 800, replace = T)
# A tibble: 800 x 10
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
<int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 53 153 253 353 453 553 653 753 853 953
2 14 114 214 314 414 514 614 714 814 914
3 10 110 210 310 410 510 610 710 810 910
4 70 170 270 370 470 570 670 770 870 970
5 36 136 236 336 436 536 636 736 836 936
6 77 177 277 377 477 577 677 777 877 977
7 13 113 213 313 413 513 613 713 813 913
8 58 158 258 358 458 558 658 758 858 958
9 29 129 229 329 429 529 629 729 829 929
10 3 103 203 303 403 503 603 703 803 903
# ... with 790 more rows
Antwoord 9
Selecteer een willekeurige steekproef uit een tibble-type in R:
library("tibble")
a <- your_tibble[sample(1:nrow(your_tibble), 150),]
nrow neemt een tibble en geeft het aantal rijen terug. De eerste parameter die aan sample
wordt doorgegeven, is een bereik van 1 tot het einde van je tibble. De tweede parameter die wordt doorgegeven aan steekproef, 150, is hoeveel willekeurige steekproeven u wilt. De slicing met vierkante haakjes specificeert de rijen van de indices die worden geretourneerd. Variabele ‘a’ krijgt de waarde van de willekeurige steekproef.
Antwoord 10
Ik ben nieuw in R, maar ik gebruikte deze eenvoudige methode die voor mij werkt:
sample_of_diamonds <- diamonds[sample(nrow(diamonds),100),]
PS: Voel je vrij om op te merken als het een nadeel heeft waar ik niet aan denk.
Antwoord 11
Je zou dit kunnen doen:
sample_data = data[sample(nrow(data), sample_size, replace = FALSE), ]