2016-02-25 23 views
0

我想將多個訓練和測試數據框的列表輸入到一個函數中,其中我操縱數據,執行迴歸等,然後將結果作爲對象或數據框的列表輸出。如何從R中的函數返回多個對象的列表?

這裏有一個簡單的編碼例玩具數據:

# Create sample datasets 
    train1 <- data.frame(y=c(1,2,3),x=c(10,20,30)) 
    train2 <- data.frame(y=c(2,3,4),x=c(15,25,35)) 
    train3 <- data.frame(y=c(3,4,5),x=c(20,30,40)) 
    test1 <- data.frame(y=c(2,3,4),x=c(15,25,35)) 
    test2 <- data.frame(y=c(3,4,5),x=c(25,35,45)) 
    test3 <- data.frame(y=c(4,5,6),x=c(35,45,55)) 

# Gather train & test datasets into list and initialize output_list 
    train_subset <- mget(paste0("train", 1:3), envir = .GlobalEnv) 
    test_subset <- mget(paste0("test", 1:3), envir = .GlobalEnv) 
    output_list <- setNames(lapply(1:3, function(i) list()), paste0('output_', 1:3)) 

f <- function(a,b,c) 
{ 
    a$log_y <- log(a$y) 
    trainy <- c(log(a$y)) 
    testx <- data.matrix(b) 
    list_i <- list(trainy, testx) 
    return(output_list <<- list(c, list_i)) 
} 

mapply(f, train_subset, test_subset, output_list, SIMPLIFY=F) 

打印出以下幾點:

$train1 
$train1[[1]] 
list() 

$train1[[2]] 
$train1[[2]][[1]] 
[1] 0.0000000 0.6931472 1.0986123 

$train1[[2]][[2]] 
    y x 
[1,] 2 15 
[2,] 3 25 
[3,] 4 35 

$train2 
$train2[[1]] 
list() 

$train2[[2]] 
$train2[[2]][[1]] 
[1] 0.6931472 1.0986123 1.3862944 

$train2[[2]][[2]] 
    y x 
[1,] 3 25 
[2,] 4 35 
[3,] 5 45 

$train3 
$train3[[1]] 
list() 

$train3[[2]] 
$train3[[2]][[1]] 
[1] 1.098612 1.386294 1.609438 

$train3[[2]][[2]] 
    y x 
[1,] 4 35 
[2,] 5 45 
[3,] 6 55 

然而,只有trainytestx爲train3和TEST3被保存到output_list對象 - TRAIN1, test1,train2和test2丟失:

> output_list 
[[1]] 
list() 

[[2]] 
[[2]][[1]] 
[1] 1.098612 1.386294 1.609438 

[[2]][[2]] 
    y x 
[1,] 4 35 
[2,] 5 45 
[3,] 6 55 

如何返回包含函數中所有輸出向量和矩陣的列表?

感謝

+0

你爲什麼要做'return(output_list << - list(c,list_i))'而不是僅僅返回列表? – Dason

+0

@Dason這是我試圖迭代地將函數的三個迭代中的每一個的trainy和testx輸出編譯成一個全局列表,但顯然它不起作用。 – RobertF

回答

0

一些試驗和錯誤之後,我發現了一個簡單的解決方案 - 我會張貼在這裏萬一有興趣:

f <- (function(a,b) 
    { 
     trainy <- c(log(a$y)) 
     trainx <- data.matrix(a) 
     testx <- data.matrix(b) 
     list_i <<- list(trainy, testx) 
    }) 

fit <- mapply(f,train_subset,test_subset) 

其中對象fit是包含trainy 2×3的矩陣和testx輸出。