Подмножество из разных фреймов данных с использованием 1 цикла - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь создать подмножества из 3 исходных фреймов данных (data_A, data_B, data_ c) на основе значения определенной переменной, которая совместно используется этими наборами данных (то есть рабочими часами). Значение переменной, под которой я хочу создать подмножества, будет одинаковым для всех наборов данных. Я хочу, чтобы созданные подмножества были помечены как Dataset_1 - Dataset_11 для подмножеств data_A, Dataset_12 - Dataset_22 ​​для подмножеств data_B и Dataset_23 - Dataset_33 для подмножеств data_ C.

Прямо сейчас у меня есть следующее решение:

for (i in 1:11){
  assign(paste0("Dataset_",i), subset(data_A, workhours>=(0+(i-1)*5)))
}

for (i in 12:22){
  assign(paste0("Dataset_",i), subset(data_B, workhours>=(0+(i-12)*5)))
}

for (i in 23:33){
  assign(paste0("Dataset_",i), subset(data_C, workhours>=(0+(i-23)*5)))
}

Это прекрасно работает. Однако возможно ли использовать всего 1 л oop вместо 3?

РЕДАКТИРОВАТЬ:

решение:

for (i in 1:11){
    assign(paste0("Dataset_",i), subset(data_A, workhours>=((i-11)*5)))
    assign(paste0("Dataset_",i+11), subset(data_B, workhours>=((i)*5)))
    assign(paste0("Dataset_",i+23), subset(data_C, workhours>=((i)*5)))
}

другое решение можно найти ниже

Ответы [ 3 ]

2 голосов
/ 28 января 2020

Я думаю, вы можете использовать lapply над списком фреймов данных, а затем использовать split с findInterval, чтобы разбить каждый фрейм данных на несколько фреймов данных.

bob <-list(data_A, data_B, data_C)
values <- seq(0, 50, 5)

temp <- unlist(lapply(bob, function(x) 
              split(x, findInterval(x$workhours, values))), recursive = FALSE)
names(temp) <- paste0('Dataset_', 1:33)

Лучше хранить данные в списке, а не загрязнять глобальную среду, однако, если они вам все еще нужны как отдельные кадры данных, мы можем использовать list2env.

list2env(temp, .GlobalEnv)
1 голос
/ 28 января 2020
for (i in 1:11){
    assign(paste0("Dataset_",i), subset(data_A, workhours>=((i-11)*5)))
    assign(paste0("Dataset_",i+11), subset(data_B, workhours>=((i)*5)))
    assign(paste0("Dataset_",i+23), subset(data_C, workhours>=((i)*5)))
}
1 голос
/ 28 января 2020

Попробуйте

       j in names(bob)

Сейчас вы перебираете весь список в jl oop.

...