2013-02-09 6 views
7

Я хотел бы переплести два data.frame в R. Например:Interweave два data.frames в R

a = data.frame(x=1:5, y=5:1) 
b = data.frame(x=2:6, y=4:0) 

Я хотел бы результат выглядеть следующим образом:

> x y 
    1 5 
    2 4 
    2 4 
    3 3 
    3 3 
    ... 

, полученного cbind Инг x[1] с y[1], x[2] с y[2] и т.д.

Что такое чистый способ сделать это? Прямо сейчас мое решение включает в себя выплескивание всего списка и слияние. Это очень некрасиво:

lst = lapply(1:length(x), function(i) cbind(x[i,], y[i,])) 
res = do.call(rbind, lst) 

ответ

5

Вы можете сделать это, указав x и y с индексом, rbind и сортировать по индексу.

a = data.frame(x=1:5, y=5:1) 
b = data.frame(x=2:6, y=4:0) 
df <- rbind(data.frame(a, index = 1:nrow(a)), data.frame(b, index = 1:nrow(b))) 
df <- df[order(df$index), c("x", "y")] 
4

Это, как я бы подойти:

dat <- do.call(rbind.data.frame, list(a, b)) 
dat[order(dat$x), ] 

do.call не было необходимости на первом этапе, но делает решение более расширяемой.

3

Возможно, это обман немного, но функция (неэкспортированная) interleave из ggplot2 является то, что я украл для своих собственных целей раньше:

as.data.frame(mapply(FUN=ggplot2:::interleave,a,b)) 
12

Существует, конечно, функция interleave в пакете «gdata»:

library(gdata) 
interleave(a, b) 
# x y 
# 1 1 5 
# 6 2 4 
# 2 2 4 
# 7 3 3 
# 3 3 3 
# 8 4 2 
# 4 4 2 
# 9 5 1 
# 5 5 1 
# 10 6 0