R: Return 来自应用函数的两个对象

R: Return two objects from apply function

我在数据帧 predictions 上循环函数 cutoff 并且函数正确 returns 一个新的 df (correct_pred) 有两列。 但我也想为列表中的每个应用循环保护 df Percent 。我怎样才能做到这一点?现在该函数只保存最后一个申请 运行 的 df。 我知道这个功能有点乱。它曾经是三个独立的函数,最初不应该循环。 请在下面找到代码和生成的输入矩阵。提前致谢!

predictions <- data.frame(col1=runif(200), col2=runif(200))
test <- data.frame(rbinom(200,1,0.5))

cutoff <- function(model){
  Percent <- as.data.frame(matrix(NA,nrow=200,ncol=19))
  for(i in 1:19){
    m = i*0.05
    Percent[,i] <- as.data.frame(ifelse(model <= m, 0, 1))
  }
  Percent <<- data.frame(Percent)
  
  validation <- as.data.frame(matrix(NA,nrow=200,ncol=19))
  for(i in 1:19){
    validation[,i] <- Percent[,i] == test
  }
  validation <- data.frame(validation)
  
  correct_pred <- as.data.frame(matrix(NA,nrow=19,ncol=1))
  for(i in 1:19){
    correct_pred[i,] <-(sum(validation[,i], na.rm = TRUE)/200)
  }
 correct_pred <<- data.frame(correct_pred)
}
correct_pred <<- as.data.frame(apply(predictions,2,cutoff))
correct_pred

考虑使用矩阵和向量并使用 apply 方法压缩代码,例如 sapplycolSums,并具有函数 return多个对象的列表:

set.seed(6521)

predictions <- replicate(2, runif(200))
test <- rbinom(200, 1, 0.5)

cutoff <- function(model){
  Percent <- sapply(1:19, function(i) ifelse(model <= i*0.05, 0, 1))
  validation <- Percent == test
  correct_pred <- colSums(validation, na.rm = TRUE)/200
  
  # RETURN NAMED LIST
  list(Percent = Percent, validation = validation, correct_pred = correct_pred)
}

output <- apply(predictions, 2, cutoff)

结果

> str(output)
List of 2
 $ :List of 3
  ..$ Percent     : num [1:200, 1:19] 1 0 1 1 1 1 1 1 1 1 ...
  ..$ validation  : logi [1:200, 1:19] FALSE TRUE TRUE FALSE TRUE FALSE ...
  ..$ correct_pred: num [1:19] 0.545 0.525 0.52 0.51 0.51 0.525 0.54 0.57 0.55 0.535 ...
 $ :List of 3
  ..$ Percent     : num [1:200, 1:19] 1 1 1 1 1 1 1 1 1 1 ...
  ..$ validation  : logi [1:200, 1:19] FALSE FALSE TRUE FALSE TRUE FALSE ...
  ..$ correct_pred: num [1:19] 0.54 0.53 0.51 0.5 0.515 0.515 0.53 0.53 0.51 0.5 ...

> head(output[[1]]$Percent)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,]    1    1    1    1    1    1    1    1    1     1     1     1     1     0     0     0     0     0     0
[2,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     0     0     0     0     0
[3,]    1    1    1    1    1    1    1    1    1     1     1     1     1     1     0     0     0     0     0
[4,]    1    1    1    1    1    1    1    1    1     1     0     0     0     0     0     0     0     0     0
[5,]    1    1    1    1    1    1    1    1    1     1     1     1     1     1     1     1     1     0     0
[6,]    1    1    1    1    1    1    1    1    1     1     1     1     0     0     0     0     0     0     0

> head(output[[1]]$validation)
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[2,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[3,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[5,]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

> output[[1]]$correct_pred
 [1] 0.545 0.525 0.520 0.510 0.510 0.525 0.540 0.570 0.550 0.535 0.520 0.530 0.515 0.500 0.490 0.485 0.485 0.485 0.475