Подмножество данных в цикле for - R - PullRequest
0 голосов
/ 22 октября 2018

Как я могу выполнить следующую операцию в цикле for?

x <- runif(30, 0, 1)
sub_1 <- x[1:10]
sub_2 <- x[11:20]
sub_3 <- x[21:30]

То есть я хочу создать три разных объекта, каждый с подмножеством исходного вектора, без написания большого количества строк кода..

Это, конечно, простой случай, который я создал, чтобы все было проще.В моем реальном случае у меня есть большой набор данных, который я хочу подобрать подобным образом и назначить имена.Я прошу цикл for, потому что я изо всех сил пытаюсь понять логику циклов for и мне редко удается заставить их работать.Так что дополнительные объяснения приветствуются.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Чтобы сделать это буквально, вы можете сделать что-то вроде:

for (i in 1:3) {
  assign(paste0("sub_", i), x[(10*i - 9):(10*i)])
}

Но от вашего приложения зависит, какой метод является оптимальным.

0 голосов
/ 22 октября 2018

Если вы действительно хотите использовать цикл for, вы можете сделать:

for (i in 1:3) {
  start <- 1 + (10 * (i - 1))
  end <- 10 * i
  assign(paste0("sub_", i), x[start:end])
}      

Но split гораздо эффективнее:

sub <- split(x, rep(1:3, each = 10))

Выходы идентичны, за исключением того, что split возвращает список.

identical(sub[[1]], sub_1)
# [1] TRUE
identical(sub[[2]], sub_2)
# [1] TRUE
identical(sub[[3]], sub_3)
# [1] TRUE
0 голосов
/ 22 октября 2018

Подумайте о создании списка sub элементов, а не о множестве похожих переменных в вашей глобальной среде.В частности, используйте lapply, используя seq для каждых 10 пунктов.Затем переименуйте элементы соответствующим образом:

seq_10 <- lapply(seq(1, length(x), 10), function(i) x[i:(i+9)])
names(seq_10) <- paste0("sub_", 1:length(seq_10))

seq_10$sub_1
# [1] 0.6091323 0.5677653 0.7335186 0.8586379 0.7416119 0.4835484 0.2038851 0.3027926 0.3422036 0.8959509

seq_10$sub_2
# [1] 0.001431539 0.679949988 0.764357517 0.988070806 0.381550391 0.251816226 0.221106522 0.111756309 0.038826363 0.625358723

seq_10$sub_3
# [1] 0.7057926 0.1263321 0.5020490 0.8753861 0.9165018 0.2342572 0.1488096 0.1639103 0.9840052 0.6850799

В качестве альтернативы используйте split для построения множителя группировок, как @Harlan показывает в этом SO ответе , получая в точности то же самое, что и в предыдущем решении:

split_10 <- split(x, ceiling(seq_along(x)/10))
names(split_10) <- paste0("sub_", 1:length(split_10))

all.equal(seq_10, split_10)
# [1] TRUE

identical(seq_10, split_10)
# [1] TRUE
...