7

data.frameRで2つを織り交ぜたいと思います。例:

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
  ...  

with 、cbindwithなどで得られます。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)
4

4 に答える 4

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
于 2013-02-09T06:05:29.897 に答える
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")]
于 2013-02-09T04:36:30.560 に答える
4

これが私がアプローチする方法です:

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

do.call最初のステップでは不要でしたが、ソリューションをより拡張可能にします。

于 2013-02-09T04:32:22.513 に答える
3

おそらくこれは少しごまかしていますが、ggplot2 の (エクスポートされていない) 関数interleave以前に自分で使用するために盗んだものです。

as.data.frame(mapply(FUN=ggplot2:::interleave,a,b))
于 2013-02-09T05:06:31.683 に答える