David
David

Reputation: 8318

Sample a single value from list of vectors multiple times

I have the following list of vectors:

list(c(663L, 705L, 680L, 769L, 775L, 327L, 665L, 805L, 808L, 
689L, 774L, 831L, 832L, 217L, 739L, 918L, 354L, 373L, 764L, 691L, 
839L, 372L, 146L, 840L, 727L, 728L, 617L, 647L, 159L, 161L, 581L, 
142L, 618L, 332L, 585L, 134L, 809L, 154L, 158L, 133L, 448L, 736L, 
737L, 815L, 876L, 151L, 750L, 701L, 778L, 861L, 584L, 692L, 427L, 
455L, 601L, 412L, 432L, 449L, 457L, 456L, 620L, 124L, 125L, 679L, 
329L, 667L, 697L, 806L, 807L, 312L, 315L, 733L, 821L, 222L, 583L, 
702L, 631L, 642L, 812L, 850L, 726L, 853L, 129L, 660L, 799L, 410L, 
188L, 798L, 130L, 703L, 341L, 826L, 137L, 253L, 123L, 827L, 844L, 
786L, 655L, 879L, 695L, 749L, 866L, 820L, 890L, 889L, 888L, 694L, 
744L, 746L, 813L, 818L, 868L, 873L, 872L, 869L, 870L, 414L, 738L, 
751L, 208L, 209L, 210L, 899L, 900L, 901L, 903L, 902L, 904L, 913L, 
911L, 912L, 767L, 917L, 777L, 521L, 396L, 397L, 915L, 277L, 529L, 
740L, 509L, 508L, 524L, 224L, 790L, 791L, 698L, 725L, 696L, 817L, 
802L, 897L, 898L, 787L, 788L, 789L, 462L, 356L, 395L, 693L, 745L, 
469L, 519L, 336L, 355L, 792L, 556L, 375L, 398L, 358L, 399L, 720L, 
539L, 558L, 331L, 166L, 167L, 128L, 131L, 214L, 239L, 269L, 276L, 
213L, 337L, 176L, 304L, 503L, 394L, 296L, 298L, 211L, 223L, 238L, 
338L, 487L, 490L, 488L, 489L, 273L, 274L, 892L, 300L, 301L, 816L, 
819L, 275L, 752L, 139L, 206L, 420L, 793L, 215L, 320L, 321L, 676L, 
226L, 699L, 325L, 252L, 319L, 672L, 236L, 306L, 743L, 237L, 439L, 
212L, 675L, 333L, 429L, 476L, 478L, 704L, 768L, 440L, 517L, 518L, 
776L, 810L, 413L, 554L, 555L, 765L, 622L, 626L, 624L, 625L, 231L, 
577L, 335L, 628L, 629L, 511L, 339L, 352L, 353L, 138L, 578L, 349L, 
496L, 611L, 606L, 614L, 612L, 613L, 607L, 609L, 608L, 610L, 328L, 
194L, 195L, 639L, 183L, 632L, 340L, 418L, 308L, 435L, 436L, 437L, 
543L, 905L, 914L, 428L, 374L, 444L, 502L, 825L, 510L, 732L, 557L, 
559L, 730L, 566L, 567L, 506L, 520L, 531L, 534L, 549L, 630L, 174L, 
175L, 140L, 677L, 426L, 377L, 392L, 196L, 186L, 197L, 144L, 141L, 
407L), c(887L, 886L, 884L, 885L), c(528L, 527L, 525L, 526L), 
    c(70L, 71L, 75L, 77L, 72L, 73L, 74L, 76L), c(111L, 109L, 
    110L, 98L, 120L, 112L, 116L, 103L, 106L, 93L, 95L, 94L, 119L, 
    117L, 99L, 118L), c(87L, 88L, 89L, 81L, 82L, 83L, 84L, 85L, 
    86L, 91L, 92L, 949L, 126L, 127L, 90L, 122L), c(530L, 185L, 
    202L, 363L, 729L, 880L, 368L, 401L, 391L, 405L, 906L, 513L, 
    652L, 708L, 552L, 766L, 505L, 382L, 383L, 803L, 565L, 571L, 
    572L, 688L, 460L, 480L, 661L, 153L, 859L, 256L, 268L, 685L, 
    763L, 147L, 865L, 874L, 741L, 754L, 858L, 878L, 220L, 225L, 
    307L, 317L, 313L, 758L, 314L, 848L, 163L, 165L, 387L, 452L, 
    378L, 270L, 271L, 464L, 302L, 280L, 283L, 504L, 712L, 281L, 
    801L), c(595L, 596L, 597L, 908L, 841L, 842L, 493L, 669L, 
    783L, 360L, 507L, 500L, 501L, 823L, 824L, 779L, 891L, 780L, 
    781L, 760L, 379L, 756L, 762L, 857L, 814L, 759L, 854L, 867L, 
    871L, 856L, 855L, 877L, 851L, 852L, 318L, 735L, 811L, 619L, 
    863L, 322L, 326L, 310L, 309L, 323L, 324L, 459L, 700L, 461L, 
    687L, 664L, 668L, 587L, 590L, 562L, 563L, 564L, 574L, 569L, 
    573L, 342L, 547L, 561L, 568L, 575L, 662L, 240L, 316L, 311L, 
    761L, 443L, 445L, 446L, 836L, 755L, 909L, 910L, 830L, 533L, 
    881L, 916L, 716L, 843L, 666L, 690L, 670L, 551L, 173L, 466L, 
    415L, 748L, 718L, 860L, 673L, 747L, 742L, 846L, 875L, 576L, 
    345L, 594L, 604L, 644L, 603L, 602L, 605L, 598L, 441L, 442L, 
    450L, 453L, 616L, 447L, 454L, 419L, 433L, 822L, 431L, 634L, 
    633L, 645L, 586L, 615L, 359L, 421L, 361L, 385L, 386L, 347L, 
    351L, 757L, 834L, 835L, 155L, 481L, 169L, 390L, 170L, 636L, 
    417L, 711L, 160L, 162L, 143L, 156L, 593L, 150L, 657L, 656L, 
    658L, 152L, 648L, 357L, 380L, 434L, 829L, 847L, 580L, 145L, 
    678L, 164L, 430L, 203L, 204L, 198L, 199L, 635L, 637L, 640L, 
    641L, 544L, 179L, 828L, 148L, 254L, 184L, 653L, 650L, 651L, 
    191L, 200L, 201L, 177L, 178L, 181L, 182L, 207L, 495L, 424L, 
    381L, 403L, 282L, 404L, 406L, 710L, 278L, 279L, 494L, 484L, 
    485L, 486L, 425L, 498L, 497L, 334L, 348L, 371L, 463L, 467L, 
    686L, 362L, 402L, 384L, 400L, 230L, 344L, 671L, 684L, 546L, 
    560L, 709L, 479L, 550L, 570L, 388L, 389L, 149L, 190L, 221L, 
    376L), c(1364L, 1373L, 1371L, 1372L, 1148L, 1211L, 1369L, 
    1370L, 1165L, 1377L, 1378L, 1112L, 1140L, 1139L, 1143L, 1019L, 
    1006L, 1247L, 1263L, 1191L, 1208L, 1059L, 1062L, 1115L, 1451L, 
    1448L, 1449L, 1113L, 1144L, 1458L, 1498L, 1499L, 955L, 968L, 
    1093L, 1365L, 1141L, 1265L, 1248L, 1249L, 1040L, 985L, 1119L, 
    1107L, 986L, 1197L, 1317L, 975L, 1155L, 1267L, 1215L, 1266L, 
    1106L, 1111L, 1058L, 1060L, 1457L, 1250L, 1314L, 1234L, 1146L, 
    1315L, 1101L, 1116L, 1310L, 1335L, 1041L, 1114L, 1124L, 954L, 
    1351L, 1358L, 1011L, 1409L, 1049L, 1167L, 1341L, 1278L, 1316L, 
    1392L, 1418L, 1307L, 1342L, 1086L, 1356L, 1432L, 1434L, 1466L, 
    1467L, 1479L, 1501L, 1487L, 1496L, 1495L, 1497L, 1476L, 1505L, 
    1506L, 1508L, 1507L, 1510L, 944L, 950L), c(1069L, 1094L, 
    1200L, 1306L, 981L, 1110L, 1206L, 1308L, 1047L, 1207L, 1312L, 
    1313L, 1109L, 1334L, 1309L, 1332L), c(1237L, 1242L, 1240L, 
    1243L, 1239L, 1238L, 1241L, 1343L, 1181L, 1301L, 1298L, 1300L, 
    1117L, 1133L, 1061L, 1419L, 1416L, 1417L, 1453L, 1311L, 1339L, 
    1333L, 1336L, 1028L, 1079L, 1459L, 1486L, 1192L, 1010L, 1012L, 
    1125L, 1199L, 1142L, 1205L, 1196L, 1198L, 951L, 1137L, 1128L, 
    1435L), c(930L, 942L, 922L, 940L, 941L, 943L, 920L, 921L, 
    923L, 925L, 927L, 928L, 924L, 926L, 931L, 932L, 937L, 938L, 
    939L, 935L, 936L, 929L, 933L, 934L), c(956L, 1051L, 1433L, 
    1468L, 1077L, 973L, 1438L, 1009L, 1158L, 1082L, 1170L, 1195L, 
    1177L, 1212L, 1213L, 1088L, 1153L, 1152L, 1354L, 959L, 1052L, 
    1176L, 1178L, 957L, 1376L, 1374L, 1375L, 1159L, 1223L, 1227L, 
    1268L, 1302L, 1275L, 1285L, 1016L, 1014L, 1126L, 1055L, 1102L, 
    1171L, 1327L, 1183L, 1274L, 1288L, 1296L, 1186L, 1297L, 1426L, 
    1454L, 1515L, 1078L, 989L, 990L, 980L, 1098L, 1150L, 1151L
    ), 78:79, c(1455L, 1475L, 1509L, 1477L, 1478L, 1494L, 1490L, 
    1491L, 1492L, 1427L, 1425L, 1473L, 1471L, 1472L, 1474L, 977L, 
    1179L, 1299L, 1290L, 1292L, 1480L, 1187L, 1295L, 1233L, 1188L, 
    1185L, 1293L, 1184L, 1294L, 1291L, 1175L, 1286L, 1424L, 1469L, 
    1502L, 1503L, 1421L, 1103L, 1488L, 1489L, 1092L, 1452L, 1350L, 
    1046L, 1166L, 1100L, 1305L, 1180L, 1182L, 1190L, 1289L, 979L, 
    961L, 1406L, 1273L, 1303L, 1456L, 1105L, 1331L, 1304L, 1407L, 
    994L, 1022L, 1021L, 1020L, 1025L, 1024L, 1023L, 1026L, 1216L, 
    1163L, 1161L, 1262L, 1156L, 1164L, 1230L, 1228L, 1224L, 80L, 
    953L, 962L, 974L, 992L, 1004L, 1005L, 1017L, 1031L, 1032L, 
    1029L, 1030L, 1057L, 982L, 1003L, 1007L, 1008L, 1042L, 1097L, 
    1089L, 1160L, 963L, 972L, 1070L, 1044L, 1431L, 1194L, 1204L, 
    993L, 1000L, 1001L, 1209L, 1210L, 1470L, 1287L, 1493L, 1075L, 
    1073L, 1074L, 1355L, 1090L, 1154L, 1357L, 1085L, 1087L, 1218L, 
    1504L, 1217L, 1174L, 1269L, 1270L, 1120L, 1272L, 1015L, 1018L, 
    946L, 1145L, 1397L, 971L, 1083L, 1284L, 1045L, 1048L, 1360L, 
    1361L, 1149L, 1282L, 1235L, 1236L, 1172L, 1367L, 1368L, 1345L, 
    964L, 976L, 1189L, 1281L, 1280L, 1279L, 1330L, 1328L, 1329L, 
    1157L, 1271L, 1324L, 1325L, 1081L, 1398L, 1391L, 1393L, 1405L, 
    1420L, 1104L, 1168L, 1201L, 1202L, 1338L, 1340L, 1277L, 1283L, 
    945L, 978L, 1422L, 1054L, 1076L, 960L, 1096L, 1091L, 1080L, 
    1169L, 1276L, 1050L, 1084L, 1035L, 1053L, 1095L, 1173L, 1056L, 
    1099L, 1138L, 997L, 1162L, 958L, 947L, 1344L), c(1222L, 1221L, 
    1219L, 1220L), c(1444L, 1446L, 1447L, 1445L, 1450L, 1132L, 
    1131L, 1130L, 1253L, 1462L, 1129L, 1254L, 965L, 966L, 967L, 
    1463L, 1134L, 1485L, 1483L, 1481L, 1482L, 1513L, 1465L, 1464L, 
    1512L, 1255L, 1258L, 1381L, 1318L, 1257L, 1323L, 1027L, 1251L, 
    1252L, 1214L, 1229L, 1256L, 1225L, 1226L, 1349L, 1352L, 1347L, 
    1348L, 1430L, 1428L, 1429L, 1436L, 1439L, 1440L, 952L, 1399L, 
    1389L, 1410L, 1385L, 1380L, 1401L, 1382L, 1366L, 1404L, 1403L, 
    1402L, 1400L, 1259L, 1415L, 1414L, 1413L, 1411L, 1412L, 1036L, 
    1039L, 1387L, 1386L, 1383L, 1379L, 1396L, 1394L, 1395L), 
    c(1322L, 1321L, 1319L, 1320L), c(998L, 1193L, 1072L, 991L, 
    999L, 1261L, 1326L, 1043L, 1037L, 1038L, 1353L, 1260L, 1390L, 
    1437L, 1346L, 1384L, 1408L, 1127L, 1423L, 1147L, 1135L, 1514L
    ), c(579L, 643L, 189L, 192L, 599L, 600L, 591L, 423L, 458L, 
    422L, 654L, 365L, 772L, 833L, 771L, 770L, 837L, 838L, 227L, 
    416L, 706L, 773L, 849L, 542L, 621L, 364L, 845L, 919L, 346L, 
    707L, 659L, 135L, 721L), c(305L, 255L, 795L, 800L, 719L, 
    734L, 794L, 1108L, 1136L, 1118L, 1071L, 1264L, 1203L, 1337L, 
    108L, 1232L, 1362L), c(674L, 796L, 864L, 235L, 724L, 408L, 
    731L, 723L, 722L, 548L, 168L, 797L, 132L, 205L, 649L, 180L, 
    582L, 330L, 157L, 465L, 499L, 536L, 516L, 883L), c(491L, 
    411L, 171L, 172L, 216L, 681L, 682L, 343L, 862L, 896L, 538L, 
    882L, 907L, 468L, 474L, 473L, 472L, 471L, 470L, 475L, 244L, 
    243L, 242L, 257L, 260L, 263L, 262L, 261L, 259L, 258L, 266L, 
    265L, 264L, 267L, 229L, 483L, 893L, 245L, 241L, 299L, 409L, 
    136L, 638L, 588L, 589L, 234L, 232L, 293L, 294L, 251L, 250L, 
    247L, 246L, 286L, 287L, 292L, 291L, 290L, 272L, 233L, 248L, 
    249L, 297L, 303L, 785L, 717L, 894L, 895L, 366L, 367L, 477L, 
    532L, 350L, 370L), c(289L, 288L, 284L, 285L), c(96L, 101L, 
    104L, 107L, 105L, 114L, 121L, 102L, 113L, 115L, 97L, 100L
    ), c(948L, 970L, 1033L, 969L, 996L, 987L, 988L, 995L, 1002L, 
    1034L, 1067L, 1068L, 1013L, 983L, 984L, 1460L, 1442L, 1500L, 
    1484L, 1246L, 1511L, 1461L, 1123L, 1443L, 1388L, 1063L, 1363L, 
    1064L, 1122L, 1359L, 1121L, 1231L, 1244L, 1245L, 1066L, 1065L, 
    1441L), c(295L, 438L, 753L, 782L, 219L, 228L, 714L, 369L, 
    553L, 393L, 713L, 683L, 784L, 492L, 715L, 482L, 541L, 592L, 
    451L, 627L, 187L, 193L, 804L, 623L, 646L, 514L, 515L, 522L, 
    512L, 523L, 545L, 218L, 535L, 537L, 540L), 16L, c(15L, 18L
    ), 1L, c(7L, 9L), 6L, 14L, 4L, 5L, 3L, 11L, 17L, 8L, 10L)

I want to sample a single value from each of the list entries for each iteration in order to create a large matrix of samples, meaning the I'll have 40 columns (the amount of groups) and 5000 rows (the amount of times to sample)

I tried the following:

# groups - is the list
# repetition - is 5000
as.matrix(sapply(groups, sample, repetition, TRUE))

This seem to work for small list, but when I try on the big list I get elements from other groups who shouldn't appear:

Example using the code above:

enter image description here

Upvotes: 2

Views: 395

Answers (3)

GKi
GKi

Reputation: 39747

The manual of sample gives the a solution for the case If ‘x’ has length 1, is numeric in the examples with:

resample <- function(x, ...) x[sample.int(length(x), ...)]

set.seed(42)
repetition <- 5
as.matrix(sapply(groups, resample, repetition, TRUE))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40]
#[1,]  778  886  525   77  106   90  153  310 1059  1110  1243   937  1051    79  1489  1220  1394  1320  1408   706  1232   180   907   288    96  1231   482    16    18     1     9     6    14     4     5     3    11    17     8    10
#[2,]  802  887  526   71  106  126  878  857 1250  1094  1205   936   989    78  1478  1222  1253  1321  1127   838  1362   723   216   284    97  1442   545    16    18     1     7     6    14     4     5     3    11    17     8    10
#[3,]  222  885  528   71   95   82  202  145 1370  1109  1196   938  1433    79  1424  1221  1214  1321   999   845  1264   516   350   288   113   983   537    16    15     1     7     6    14     4     5     3    11    17     8    10
#[4,]  237  884  528   74   98   81  280  309 1365  1313  1028   943   980    79  1277  1222  1463  1321  1437   772  1136   408   287   288   113   987   523    16    18     1     9     6    14     4     5     3    11    17     8    10
#[5,]  224  885  527   75  120   88  763  143 1114   981  1336   943  1052    79  1044  1222  1036  1320  1043   227  1071   674   473   285   104  1441   218    16    18     1     9     6    14     4     5     3    11    17     8    10

Where sample.int takes the number of items to choose from and sample elements from which to choose or a positive integer.

Upvotes: 1

jay.sf
jay.sf

Reputation: 73842

We may list single values into a sub list, to avoid the 1:x "convenience". Example:

groups <- list(2, 9, 2:9, 22:99)

groups[lengths(groups) == 1] <- lapply(groups[lengths(groups) == 1], list)
str(groups)
# List of 4
# $ :List of 1
#  ..$ : num 2
# $ :List of 1
#  ..$ : num 9
# $ : int [1:8] 2 3 4 5 6 7 8 9
# $ : int [1:78] 22 23 24 25 26 27 28 29 30 31 ...

repetition <- 10
set.seed(42)
r <- t(replicate(repetition, sapply(groups, sample, 1, replace=TRUE)))
r
#     [,1] [,2] [,3] [,4]
#  [1,] 2    9    2    46  
#  [2,] 2    9    3    70  
#  [3,] 2    9    9    92  
#  [4,] 2    9    6    41  
#  [5,] 2    9    8    24  
#  [6,] 2    9    4    57  
#  [7,] 2    9    6    26  
#  [8,] 2    9    5    24  
#  [9,] 2    9    3    45  
# [10,] 2    9    8    43  

Note, that the sub lists of length one are sampled as lists and sapply simplifies them to integers internally using simplify2array (i.e. unlists them).

Upvotes: 1

Ronak Shah
Ronak Shah

Reputation: 389335

When you have vector of length 1 the sampling happens from 1:x. From ?sample :

If x has length 1, is numeric (in the sense of is.numeric) and x >= 1, sampling via sample takes place from 1:x

So when you do

set.seed(123)
sample(10, 1)
#[1] 3

It is selecting 1 number from 1 to 10. To avoid that from happening you can check length of vector in sapply :

sapply(groups, function(x) if(length(x) == 1) rep(x, repetition) 
                           else sample(x, repetition, replace = TRUE))

So this will return the same number repetition number of times when the length of vector is 1.

Upvotes: 2

Related Questions