Here's one way to do it with the plyr package:
library('plyr')
f <- function(df) with(df, data.frame(B = B, E = seq(C, D)))
ddply(d, 'A', f)
A corresponding solution with the data.table package would be
library('data.table')
dt <- data.table(d, key = 'A')
dt[, list(B, E = seq(C, D)), by = 'A']
> d <- data.frame(A=c("a","b"), B=2:3, C=c(1,3), D=c(4,5))
> lengths <- 1 + d$D - d$C
> cbind(d[rep(seq_along(lengths), lengths),c("A","B")],
> E=unlist(lapply(seq_along(lengths), function(i)seq(from=d$C[i], to=d$D[i]
A B E
1 a 2 1
1.1 a 2 2
1.2 a 2 3
1.3 a 2 4
2 b 3 3
2.1 b 3 4
2.2 b
On 07.10.2011 16:02, darkgaze wrote:
Hi all,
Would appreciate help with transforming this:
A B C D
a 2 1 4
b 3 3 5
into this:
A B E
a 2 1
a 2 2
a 2 3
a 2 4
b 3 3
b 3 4
b 3 5
(C<=E<=D)
do.call(rbind, apply(dat, 1, function(x) data.frame(A=x[1], B=x[2],
E=seq(x[3], x[4]
Uwe Ligges
3 matches
Mail list logo