Cade, Brian
2014-Apr-15 20:26 UTC
[R] indexing names for looping across computations done on pairs of matrices
So I know I must be missing something simple and obvious for the following data manipulation where I have (in this example) 11 pairs of matrices (gs4.0 to gs4.100 and ps1.0 to ps1.100) from some population simulations (all with same dimensions) where I want to get some summary statistics on the products of the cells in a pair (e.g., gs4.0 * ps1.0). The code I wrote below works fine, but it seems like there ought to be a simple way to index the extensions on the names (.0 to .100) in a for loop to simplify this code greatly. I've spent some time trying various things using paste() and assign() and have had no success. mean.comb <- as.matrix(0:10,nrow = 11, ncol=1) mean.comb <- cbind(mean.comb,0) ###to see list of files created gs4files <- ls(pattern="gs4.*0") ps1files <- ls(pattern="ps1.*0") mean.comb[1,2] <- mean(apply(gs4.0 * ps1.0,1,sum)) mean.comb[2,2] <- mean(apply(gs4.10 * ps1.10,1,sum)) mean.comb[3,2] <- mean(apply(gs4.20 * ps1.20,1,sum)) mean.comb[4,2] <- mean(apply(gs4.30 * ps1.30,1,sum)) mean.comb[5,2] <- mean(apply(gs4.40 * ps1.40,1,sum)) mean.comb[6,2] <- mean(apply(gs4.50 * ps1.50,1,sum)) mean.comb[7,2] <- mean(apply(gs4.60 * ps1.60,1,sum)) mean.comb[8,2] <- mean(apply(gs4.70 * ps1.70,1,sum)) mean.comb[9,2] <- mean(apply(gs4.80 * ps1.80,1,sum)) mean.comb[10,2] <- mean(apply(gs4.90 * ps1.90,1,sum)) mean.comb[11,2] <- mean(apply(gs4.100 * ps1.100,1,sum)) mean.comb<- data.frame(mean.comb) colnames(mean.comb) <- c("simulation", "mean.horses.removed") Brian Brian S. Cade, PhD U. S. Geological Survey Fort Collins Science Center 2150 Centre Ave., Bldg. C Fort Collins, CO 80526-8818 email: cadeb@usgs.gov <brian_cade@usgs.gov> tel: 970 226-9326 [[alternative HTML version deleted]]
arun
2014-Apr-16 02:11 UTC
[R] indexing names for looping across computations done on pairs of matrices
Hi, If the two pairs of matrices are in a list: set.seed(42) lst1 <- lapply(1:11, function(x) matrix(sample(40, 20, replace=TRUE), 5,4)) names(lst1) <- paste0("gs", paste0("4.",seq(0,100,by=10))) set.seed(585) lst2 <- lapply(1:11, function(x) matrix(sample(40, 20, replace=TRUE), 5,4)) names(lst2) <- paste0("ps", paste0("1.",seq(0,100,by=10))) mean.comb <- data.frame(simulation=0:10, mean.horses.removed=sapply(seq_along(lst1),function(i) mean(rowSums(lst1[[i]]*lst2[[i]]))))? #or # if the datasets are standalone with no particular order #just for demonstration attach(lst1) attach(lst2) vec1 <- sample(paste0("gs", paste0("4.",seq(0,100,by=10))), 11, replace=FALSE) vec2 <- sample(paste0("ps", paste0("1.",seq(0,100,by=10))), 11, replace=FALSE) vec1New <- vec1[order(as.numeric(gsub(".*\\.","",vec1)))] vec2New <- vec2[order(as.numeric(gsub(".*\\.","",vec2)))] mean.comb2 <- data.frame(simulation=0:10, mean.horses.removed=sapply(seq_along(vec1New),function(i) mean(rowSums(get(vec1New[i])* get(vec2New[i]))))) identical(mean.comb,mean.comb2) #[1] TRUE A.K. On Tuesday, April 15, 2014 4:30 PM, "Cade, Brian" <cadeb at usgs.gov> wrote: So I know I must be missing something simple and obvious for the following data manipulation where I have (in this example) 11 pairs of matrices (gs4.0 to gs4.100 and ps1.0 to ps1.100) from some population simulations (all with same dimensions) where I want to get some summary statistics on the products of the cells in a pair (e.g., gs4.0 * ps1.0).? The code I wrote below works fine, but it seems like there ought to be a simple way to index the extensions on the names (.0 to .100) in a for loop to simplify this code greatly.? I've spent some time trying various things using paste() and assign() and have had no success. mean.comb <- as.matrix(0:10,nrow = 11, ncol=1) mean.comb <- cbind(mean.comb,0) ###to see list of files created gs4files <- ls(pattern="gs4.*0") ps1files <- ls(pattern="ps1.*0") mean.comb[1,2] <- mean(apply(gs4.0 * ps1.0,1,sum)) mean.comb[2,2] <- mean(apply(gs4.10 * ps1.10,1,sum)) mean.comb[3,2] <- mean(apply(gs4.20 * ps1.20,1,sum)) mean.comb[4,2] <- mean(apply(gs4.30 * ps1.30,1,sum)) mean.comb[5,2] <- mean(apply(gs4.40 * ps1.40,1,sum)) mean.comb[6,2] <- mean(apply(gs4.50 * ps1.50,1,sum)) mean.comb[7,2] <- mean(apply(gs4.60 * ps1.60,1,sum)) mean.comb[8,2] <- mean(apply(gs4.70 * ps1.70,1,sum)) mean.comb[9,2] <- mean(apply(gs4.80 * ps1.80,1,sum)) mean.comb[10,2] <- mean(apply(gs4.90 * ps1.90,1,sum)) mean.comb[11,2] <- mean(apply(gs4.100 * ps1.100,1,sum)) mean.comb<- data.frame(mean.comb) colnames(mean.comb) <- c("simulation", "mean.horses.removed") Brian Brian S. Cade, PhD U. S. Geological Survey Fort Collins Science Center 2150 Centre Ave., Bldg. C Fort Collins, CO? 80526-8818 email:? cadeb at usgs.gov <brian_cade at usgs.gov> tel:? 970 226-9326 ??? [[alternative HTML version deleted]] ______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.