arun
2014-Mar-13 15:01 UTC
[R] creating table with sequences of numbers based on the table
Hi, Try: Either tab <- read.table(text="pop Freq 1?????? 1?? 30 2?????? 2?? 25 3?????? 3?? 30 4?????? 4?? 30 5?????? 5?? 30 6?????? 6?? 30 7?????? 7?? 30",sep="",header=TRUE) indx <- rep(1:nrow(tab),tab$Freq) tab1 <- transform(tab[indx,],ind=ave(seq_along(indx),indx,FUN=seq_along))[,-2] #or tab2 <-? transform(tab[indx,],ind=unlist(sapply(tab$Freq,seq)))[,-2] identical(tab1,tab2) #[1] TRUE #or tab3 <- transform(tab[indx,], ind= with(tab,seq_len(sum(Freq))-rep(cumsum(c(0L,Freq[-length(Freq)])),Freq)))[,-2] identical(tab1,tab3) #[1] TRUE A.K. I have a problem with transfering one table to another automatically. From table like this:> tab? pop Freq 1 ? ? ? 1 ? 30 2 ? ? ? 2 ? 25 3 ? ? ? 3 ? 30 4 ? ? ? 4 ? 30 5 ? ? ? 5 ? 30 6 ? ? ? 6 ? 30 7 ? ? ? 7 ? 30 I want to use number of individuals (freq) and then in next table just list them with following numbers (depending on total number of individuals) Like this: in pop ? ? ? ?ind ? 1 ? ? ? ? ? ? ?1 1 ? ? ? ? ? ? ?2 1 ? ? ? ? ? ? ?3 1 ? ? ? ? ? ? ?4 . ? ? ? ? ? ? ? . . ? ? ? ? ? ? ? . 1 ? ? ? ? ? ? ?30 2 ? ? ? ? ? ? ?1 2 ? ? ? ? ? ? ?2 2 ? ? ? ? ? ? ?3 2 ? ? ? ? ? ? ?4 . ? ? ? ? ? ? ? . 2 ? ? ? ? ? ? ?25 3 ? ? ? ? ? ? ?1 3 ? ? ? ? ? ? ?2 . ? ? ? ? ? ? ? . . ? ? ? ? ? ? ? . How can i do it? I think i have to use loops but so far I failed. Thank you in advance, Best, Malgorzata Gazda
Dennis Murphy
2014-Mar-13 20:55 UTC
[R] creating table with sequences of numbers based on the table
Less coding with plyr: tab <- read.table(text="pop Freq 1 1 30 2 2 25 3 3 30 4 4 30 5 5 30 6 6 30 7 7 30",sep="",header=TRUE) # Function to do the work on each row f <- function(pop, Freq) data.frame(ind = seq_len(Freq)) library(plyr) u <- mdply(tab, f)[, -2] Dennis On Thu, Mar 13, 2014 at 8:01 AM, arun <smartpink111 at yahoo.com> wrote:> Hi, > Try: > Either > > tab <- read.table(text="pop Freq > 1 1 30 > 2 2 25 > 3 3 30 > 4 4 30 > 5 5 30 > 6 6 30 > 7 7 30",sep="",header=TRUE) > > indx <- rep(1:nrow(tab),tab$Freq) > tab1 <- transform(tab[indx,],ind=ave(seq_along(indx),indx,FUN=seq_along))[,-2] > #or > tab2 <- transform(tab[indx,],ind=unlist(sapply(tab$Freq,seq)))[,-2] > identical(tab1,tab2) > #[1] TRUE > #or > tab3 <- transform(tab[indx,], ind= with(tab,seq_len(sum(Freq))-rep(cumsum(c(0L,Freq[-length(Freq)])),Freq)))[,-2] > identical(tab1,tab3) > #[1] TRUE > > A.K. > > > I have a problem with transfering one table to another automatically. From table like this: > >> tab > pop Freq > 1 1 30 > 2 2 25 > 3 3 30 > 4 4 30 > 5 5 30 > 6 6 30 > 7 7 30 > > I want to use number of individuals (freq) and then in next > table just list them with following numbers (depending on total number > of individuals) > Like this: > in > pop ind > > 1 1 > 1 2 > 1 3 > 1 4 > . . > . . > 1 30 > 2 1 > 2 2 > 2 3 > 2 4 > . . > 2 25 > 3 1 > 3 2 > . . > . . > > How can i do it? I think i have to use loops but so far I failed. > Thank you in advance, > Best, > Malgorzata Gazda > > ______________________________________________ > 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.