Home > Mobile >  Replace loop with lapply, sapply
Replace loop with lapply, sapply

Time:11-06

I'm very new to R, and I heard it's best to replace loops with apply functions, however I couldn't wrap my head around on how to transform my loop with this example. Any help would be appreciated.

file_path is a list of file names
file_path[1] = "/home/user/a.rds"
file_path[2] = "/home/user/b.rds"
...

vector_sum <- rep(0,50000)
for(i in 1:5){
  temp_data <- readRDS(file_path[i])
  temp_data <- as.matrix(temp_data[,c("loss_amount")])
  vector_sum <- vector_sum   temp_data
}

My goal is to loop through all the files, in each file only keep loss_amount column and add it to vector_sum, so in the end vector_sum is the sum of all loss_amount columns from all files

CodePudding user response:

Using rowSums.

rowSums(sapply(file_path, \(x) readRDS(x)[, 'loss_amount'], USE.NAMES=F))
# [1]  1.2060989  1.4248851 -0.4759345

Data:

set.seed(42)
l <- replicate(3, matrix(rnorm(6), 3, 2, dimnames=list(NULL, c('x', 'loss_amount'))), simplify=F)
dir.create('foo')  ## creates/overwrites `foo` in wd!
Map(\(x, y) saveRDS(x, paste0('foo/', y, '.rds')), l, letters[seq_along(l)])
file_path <- list.files('foo', full.names=TRUE)

CodePudding user response:

Here is one possible way to solve your problem using lapply:

sum(unlist(lapply(file_path, \(fle) readRDS(fle)[, "loss_amount"]))) 
# or
do.call(sum, lapply(file_path, \(fle) readRDS(fle)[, "loss_amount"]))
  • Related