Hello, How can I randomly sample individuals within a sites from a site (row) X species abundance (column) data frame or matrix? As an example, the matrix "abund2" made below. ##### (sorry, Im a newbie and this is the only way I know to get an example on here) abund1 <- c(150, 300, 0, 360, 150, 300, 0, 240, 150, 0, 60, 0, 150, 0, 540, 0, 0, 300, 0, 240, 300, 300, 0, 360, 300, 0, 600, 0) abund2 <- matrix(data=abund1, nrow=4, ncol=7) colnames(abund2) <- c("spA", "spB", "spC", "spD", "spa", "spF", "spG") rownames(abund2)<-c("site1", "site2", "site3", "site4") #####> abund2spA spB spC spD spa spF spG site1 150 150 150 150 0 300 300 site2 300 300 0 0 300 300 0 site3 0 0 60 540 0 0 600 site4 360 240 0 0 240 360 0 How can I make a random subsample of 100 individuals from the abundances given for each site? This is probably really easy. Thanks. Bubba -- View this message in context: http://r.789695.n4.nabble.com/Subsampling-out-of-site-abundance-matrix-tp3263148p3263148.html Sent from the R help mailing list archive at Nabble.com.
On Feb 6, 2011, at 3:25 PM, B77S wrote:> > Hello, > How can I randomly sample individuals within a sites from a site > (row) X > species abundance (column) data frame or matrix? As an example, the > matrix > "abund2" made below. > > ##### (sorry, Im a newbie and this is the only way I know to get an > example > on here) > > abund1 <- c(150, 300, 0, 360, 150, 300, 0, 240, 150, > 0, 60, > 0, 150, 0, 540, 0, 0, 300, 0, 240, 300, 300, 0, 360, 300, 0, 600, 0) > abund2 <- matrix(data=abund1, nrow=4, ncol=7) > colnames(abund2) <- c("spA", "spB", "spC", "spD", "spa", "spF", "spG") > rownames(abund2)<-c("site1", "site2", "site3", "site4")Perfect. Best submission of an example by a newbie in weeks.> > ##### > >> abund2 > spA spB spC spD spa spF spG > site1 150 150 150 150 0 300 300 > site2 300 300 0 0 300 300 0 > site3 0 0 60 540 0 0 600 > site4 360 240 0 0 240 360 0 > > How can I make a random subsample of 100 individuals from the > abundances > given for each site?samptbl <- apply(abund2, 1, function(x) sample(colnames(abund2), 100, prob=x, replace=TRUE) ) samptbl site1 site2 site3 site4 [1,] "spG" "spa" "spD" "spF" [2,] "spF" "spF" "spG" "spB" [3,] "spF" "spB" "spC" "spA" [4,] "spD" "spa" "spG" "spA" [5,] "spF" "spa" "spD" "spa" [6,] "spA" "spB" "spD" "spF" [7,] "spA" "spF" "spD" "spA" [8,] "spG" "spF" "spG" "spa" [9,] "spF" "spF" "spG" "spa" [10,] "spG" "spB" "spD" "spA" Snipped apply() always transposes the results when called with row margins. The t() function would "fix" this if it needed to be arranged with rows by site. You could check by further apply-(cation) of table to the columns: > apply(samptbl, 2, table) $site1 spA spB spC spD spF spG 8 13 6 13 32 28 $site2 spa spA spB spF 25 31 25 19 $site3 spC spD spG 9 51 40 $site4 spa spA spB spF 22 27 19 32> > This is probably really easy.> Thanks. > Bubba > -- > View this message in context: http://r.789695.n4.nabble.com/Subsampling-out-of-site-abundance-matrix-tp3263148p3263148.html > Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > 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.David Winsemius, MD West Hartford, CT
So, after thinking about this a bit, I realized that the previous solution wasn't exactly what I needed. I really needed replacement=F and to be able to choose any sample size (n.sample) less than or equal to the site (row) with the lowest total abundance. Anyway, I think this works. Forgive me if I have misunderstood something regarding the previous solutions output. I do not pretend to be intelligent. Cheers! ############### start function ############### RAND_L <- function(L.matrix, n.sample){ mainout <- vector("list") for(i in 1:nrow(L.matrix)){ ## decomposes species (1:ncol(L.matrix)) into a list of counts per each out<- vector("list") for(j in 1:length(L.matrix[i,])){ out[[j]] <- rep(names(L.matrix[i,])[j], L.matrix[i,j]) } ## puts previous loop products (counts) in a row out2 <- vector() for(k in 1:length(out)){ out2 <- append(out2, as.character(unlist(out[k]))) } out3<- sample(out2, n.sample, replace=F) mainout[[i]] <- out3 mainout[[i]] <- factor(mainout[[i]], levels= colnames(L.matrix)) } finalout <- t(sapply(mainout, table)) rownames(finalout)<-rownames(L.matrix) return(finalout) } ################### end function ##################> RAND_L(abund2, 100)spA spB spC spD spa spF spG site1 11 12 18 8 0 24 27 site2 24 24 0 0 27 25 0 site3 0 0 6 38 0 0 56 site4 27 20 0 0 16 37 0 -- View this message in context: http://r.789695.n4.nabble.com/Subsampling-out-of-site-abundance-matrix-tp3263148p3265402.html Sent from the R help mailing list archive at Nabble.com.