7

我想data.frame在 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
  ...  

通过cbinding x[1]with y[1], x[2]withy[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

您可以通过给出xy索引来做到这一点,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

也许这有点作弊,但interleave来自ggplot2的(非导出的)函数是我之前为自己使用而偷的东西:

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