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 方法压缩代码,例如 sapply
和 colSums
,并具有函数 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
我在数据帧 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 方法压缩代码,例如 sapply
和 colSums
,并具有函数 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