2013-02-09 12 views
7

würde Ich mag zum Beispiel zwei data.frame in R. verweben:verweben zwei data.frames in R

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

Ich würde das Ergebnis gefällt aussehen:

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

durch cbind ing erhalten x[1] mit y[1], x[2] mit y[2] usw.

Was ist der sauberste Weg, dies zu tun? Im Moment besteht meine Lösung darin, alles auf eine Liste zu spucken und zu verschmelzen. Das ist ziemlich hässlich:

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

Antwort

5

Sie können dies tun, indem Sie x und y einen Index geben, rbind sie und sortieren nach dem Index.

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

Dies ist, wie ich Ansatz würde:

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

do.call im ersten Schritt nicht notwendig war, sondern macht die Lösung mehr erweiterbar.

3

Vielleicht ist dies ein bisschen zu betrügen, aber die (nicht ausgeführten) Funktion interleave von ggplot2 ist etwas, das ich vor meinem eigenen Gebrauch gestohlen habe:

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

Es gibt, natürlich, die interleave Funktion in der "gdata" -Packung:

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 
Verwandte Themen