2013-02-09 41 views
7

Tôi muốn interweave hai data.frame trong R. Ví dụ:interweave hai data.frames trong R

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

Tôi muốn kết quả để trông giống như:

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

thu được bằng cách cbind ing x[1] với y[1], x[2] với y[2], v.v.

Cách sạch nhất để làm điều này là gì? Ngay bây giờ giải pháp của tôi liên quan đến việc khạc nhổ mọi thứ vào danh sách và hợp nhất. Điều này là khá xấu xí:

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

Trả lời

5

Bạn có thể thực hiện việc này bằng cách cung cấp xy chỉ mục, rbind chúng và sắp xếp theo chỉ mục.

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

Đây là tôi muốn tiếp cận như thế nào:

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

do.call là không cần thiết trong bước đầu tiên nhưng làm cho các giải pháp mở rộng hơn.

3

Có lẽ đây là lừa dối một chút, nhưng (không xuất khẩu) chức năng interleave từ ggplot2 là một cái gì đó tôi đã bị đánh cắp cho mục đích riêng của tôi trước đây:

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

Có là, tất nhiên, hàm interleave trong gói "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 
Các vấn đề liên quan