Выборка одного значения из списка векторов несколько раз

У меня есть следующий список векторов:

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)

Я хочу выбрать одно значение из каждой записи списка для каждой итерации, чтобы создать большую матрицу выборок, то есть у меня будет 40 столбцов (количество групп) и 5000 строк (количество раз для выборки). )

Я пробовал следующее:

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

Кажется, это работает для небольшого списка, но когда я пробую большой список, я получаю элементы из других групп, которые не должны появляться:

Пример использования приведенного выше кода:

Из описания образца (help(sample)): «Если x имеет длину 1, является числовым (в смысле is.numeric) и x >= 1, выборка через образец происходит из 1:x. Обратите внимание, что эта удобная функция может привести к к нежелательному поведению, когда x имеет разную длину в таких вызовах, как sample(x). См. примеры». В вашем списке groups есть числовые векторы длины 1, поэтому вместо выборки из этого вектора он выбирает от диапазона от 1 до значения.

Bas 21.12.2020 08:32

@Bas, да, я так небрежно пропустил это.

David 21.12.2020 08:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
2
196
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Когда у вас есть вектор длины 1, выборка происходит из 1: x. От ?sample :

Если x имеет длину 1, является числовым (в смысле is.numeric) и x >= 1, выборка с помощью выборки происходит из 1:x

Итак, когда вы делаете

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

Он выбирает 1 число от 1 до 10. Чтобы этого не произошло, вы можете проверить длину вектора в sapply:

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

Таким образом, это вернет одно и то же число repetition количество раз, когда длина вектора равна 1.

Вау, как глупо я пропустил это в документах и ​​был уверен, что сделал что-то не так. Спасибо, что указали на это.

David 21.12.2020 08:36

Ты не единственный, @David S! Выучил некоторых моих коллег тоже. Эта «функция удобства» оказалась очень неудобной... XD

QAsena 21.12.2020 08:42

Мы можем list объединять значения в подсписок, чтобы избежать 1:x «удобства». Пример:

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  

Обратите внимание, что подсписки длины один sampled как списки, а sapply упрощает их до целых чисел внутри с помощью simplify2array (т. е. unlists их).

При преобразовании в подсписок, почему он ведет себя так, как хотелось бы? я не могу этого понять

David 21.12.2020 09:01

@DavidS Я добавил объяснение.

jay.sf 21.12.2020 09:08

Руководство sample дает решение для случая, когда «x» имеет длину 1, является числовым в примерах с:

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

Где sample.int берет количество элементов для выбора и sample элементов для выбора или положительное целое число.

Другие вопросы по теме