2017-01-11 3 views
0

У меня есть этот векторДля цикла создания dataframes

panelcustomers <- c(40482, 37244, 17734, 39786, 42613, 45703, 9534, 41772, 42358, 23870, 21815, 29070, 14248, 29484, 12720, 11951, 28290, 9245, 617, 17850, 44827, 29726, 30967, 36267, 37724, 37868, 33041, 37412, 42226, 41701, 26931, 15634, 29180, 35254, 33668, 18337, 31376, 16439, 26222, 7122, 35112, 38161, 23269, 35577, 24493, 1379, 36592, 40487, 8144, 39453, 6361, 34777, 17886, 33273, 11647, 34762, 25881, 5094, 55336, 13427, 28155, 46457, 54933, 42932, 52650, 40607, 15742, 15403, 27240, 28521, 23076, 46817, 39350, 44987, 34671, 53260, 39353, 52295, 56728) 

и хотели бы использовать цикл для перебора вектора, выполнив следующий код:

pc17734_it <- subset(Paneldataexport,Paneldataexport$V1 == 17734 & Paneldataexport$V2 == "inside_temperature" & Paneldataexport$V3 <= turningpoint['17734',]) 
pc17734_st <- subset(Paneldataexport,Paneldataexport$V1 == 17734 & Paneldataexport$V2 == "set_point_temperature" & Paneldataexport$V3 <= turningpoint['17734',]) 
pi17734_it <- subset(Paneldataexport,Paneldataexport$V1 == 17734 & Paneldataexport$V2 == "inside_temperature" & Paneldataexport$V3 > turningpoint['17734',]) 
pi17734_st <- subset(Paneldataexport,Paneldataexport$V1 == 17734 & Paneldataexport$V2 == "set_point_temperature" & Paneldataexport$V3 > turningpoint['17734',]) 
interpol_pc17734_it <- approx(pc17734_it$V3, pc17734_it$V4, method = "linear", n=8352, rule = 2) 
interpol_pc17734_st <- approx(pc17734_st$V3, pc17734_st$V4, xout =  interpol_pc17734_it$x, method = "constant", rule = 1:2) 
interpol_pi17734_it <- approx(pi17734_it$V3, pi17734_it$V4, method = "linear", n=432, rule = 2) 
interpol_pi17734_st <- approx(pi17734_st$V3, pi17734_st$V4, xout = interpol_pi17734_it$x, method = "constant", rule = 1:2) 
interpol_pc17734_it$st <- interpol_pc17734_st$y 
names(interpol_pc17734_it)[names(interpol_pc17734_it) == 'y'] <- 'it' 
pc17734 <- interpol_pc17734_it 
interpol_pi17734_it$st <- interpol_pi17734_st$y 
names(interpol_pi17734_it)[names(interpol_pi17734_it) == 'y'] <- 'it' 
pi17734 <- interpol_pi17734_it 
remove(pc17734_it, pc17734_st, pi17734_it, pi17734_st, interpol_pc17734_it,  interpol_pc17734_st, interpol_pi17734_it, interpol_pi17734_st) 

Для каждой итерации число (в этом примере 17734) следует заменить следующим числом в векторе - так что в итоге результирующий фреймворк имеет имя в соответствии с номером (в этом примере pi17734 со второй последней строки). Любая идея, как пройти через этот код? Спасибо!

+0

В конце концов, вам не нужны все посредники, не так ли? Только набор данных (в данном случае 'pi7734')? – LAP

+0

Да, только pi17734 (вторая последняя строка), а также pc17734 (5-я последняя строка) – GNee

+0

Значения 'n' остаются неизменными для всего цикла? Или они доступны в подмножествах? – LAP

ответ

0

Так что это непроверено (так как вы не представили никаких данных примера), и это НЕ хороший способ работать, так как функция, которую я написал, присваивает объекты глобальной среде (которой обычно не следует делать). Но это единственный способ найти желаемую схему именования.

myfun <- function(x) { 
    a <- subset(Paneldataexport,Paneldataexport$V1 == x & 
       Paneldataexport$V2 == "inside_temperature" & 
       Paneldataexport$V3 <= turningpoint[paste0(x),]) 
    b <- subset(Paneldataexport,Paneldataexport$V1 == x & 
       Paneldataexport$V2 == "set_point_temperature" & 
       Paneldataexport$V3 <= turningpoint[paste0(x),]) 
    c <- subset(Paneldataexport,Paneldataexport$V1 == x & 
       Paneldataexport$V2 == "inside_temperature" & 
       Paneldataexport$V3 > turningpoint[paste0(x),]) 
    d <- subset(Paneldataexport,Paneldataexport$V1 == x & 
       Paneldataexport$V2 == "set_point_temperature" & 
       Paneldataexport$V3 > turningpoint[paste0(x),]) 
    a1 <- approx(a$V3, a$V4, method = "linear", n=8352, rule = 2) 
    b1 <- approx(b$V3, b$V4, xout = a1$x, method = "constant", rule = 1:2) 
    c1 <- approx(c$V3, c$V4, method = "linear", n=432, rule = 2) 
    d1 <- approx(d$V3, d$V4, xout = c1$x, method = "constant", rule = 1:2) 

    a1$st <- b1$y 
    names(a1)[names(a1) == 'y'] <- 'it' 
    assign(paste0("pc", x), a1, envir = globalenv()) 
    c1$st <- d1$y 
    names(c1)[names(c1) == 'y'] <- 'it' 
    assign(paste0("pi", x), c1, envir = globalenv()) 
} 

Петля эта функция над вашим вектором, например. с sapply(panelcustomers, myfun), и в конце вы должны иметь все нужные вам данные.

Лучший способ сделать это - сохранить все данные в одном списке, поэтому вам не понадобится использовать assign.

Редактировать: Обратите внимание, что в зависимости от размера ваших данных это может занять довольно много времени!

2nd edit: Удалены некоторые скобки.

3rd edit: Это может быть решение без global.env-присваивания. Вы можете напрямую подать свой вектор в функцию, и он должен вернуть список, содержащий a1 и c1, которые сами будут списками наборов данных.

myfun2 <- function(x) { 
    a <- lapply(x, function(z) subset(Paneldataexport,Paneldataexport$V1 == z & 
       Paneldataexport$V2 == "inside_temperature" & 
       Paneldataexport$V3 <= turningpoint[paste0(z),])) 
    b <- lapply(x, function(z) subset(Paneldataexport,Paneldataexport$V1 == z & 
       Paneldataexport$V2 == "set_point_temperature" & 
       Paneldataexport$V3 <= turningpoint[paste0(z),])) 
    c <- lapply(x, function(z) subset(Paneldataexport,Paneldataexport$V1 == z & 
       Paneldataexport$V2 == "inside_temperature" & 
       Paneldataexport$V3 > turningpoint[paste0(z),])) 
    d <- lapply(x, function(x) subset(Paneldataexport,Paneldataexport$V1 == z & 
       Paneldataexport$V2 == "set_point_temperature" & 
       Paneldataexport$V3 > turningpoint[paste0(z),])) 
    a1 <- lapply(a, function(z) approx(z$V3, z$V4, method = "linear", n=8352, rule = 2) 
    b1 <- lapply(b, function(z) approx(z$V3, z$V4, xout = a1$x, method = "constant", rule = 1:2) 
    c1 <- lapply(c, function(z) approx(z$V3, z$V4, method = "linear", n=432, rule = 2) 
    d1 <- lapply(d, function(z) approx(z$V3, z$V4, xout = c1$x, method = "constant", rule = 1:2) 

    a1$st <- b1$y 
    names(a1)[names(a1) == 'y'] <- 'it' 
    c1$st <- d1$y 
    names(c1)[names(c1) == 'y'] <- 'it' 
    datalist <- list(a1, c1) 
    return(datalist) 
} 

Используйте его следующим образом: mydata <- myfun2(panelcustomers). Опять же, это все непроверено.

+1

спасибо! Вторые скобки в конце задания b и c необходимо было удалить, после чего он работал отлично! – GNee

Смежные вопросы