【问题标题】:R: Return two objects from apply functionR:从应用函数返回两个对象
【发布时间】:2021-08-23 12:11:51
【问题描述】:

我在数据帧 predictions 上循环函数 cutoff 并且该函数正确返回具有两列的新 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

【问题讨论】:

  • 列个清单并返回
  • test 对象未在提供的代码中定义,因此 cutoff 不会运行。无论如何,可能的答案是 1) 在使用 &lt;&lt;- 的 map/apply 函数中定义一个 lambda 函数,或者返回一个像 @Bruno 所说的列表。
  • 对不起!我编辑了我的代码,它现在应该可以工作了。你能详细说明你的意思吗?
  • 既然您没有使用所有数字数据类型并且没有使用列名,为什么要使用 data.frames。只需使用矩阵。

标签: r list apply


【解决方案1】:

考虑使用矩阵和向量,并使用 apply 方法(如 sapplycolSums)压缩代码,并让函数返回多个对象的列表:

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

【讨论】:

  • 非常感谢!这非常有效,正是我想要的。
  • 很高兴听到并乐于提供帮助!编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2016-05-23
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多