【问题标题】:interweave two data.frames in R在R中交织两个data.frames
【发布时间】:2013-01-24 22:39:59
【问题描述】:

我想在R中交织两个data.frame。例如:

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]y[1]x[2]y[2] 等获得。

最干净的方法是什么?现在我的解决方案涉及将所有内容都吐到列表中并合并。这很丑:

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

【问题讨论】:

    标签: r merge dataframe rbind do.call


    【解决方案1】:

    当然,“gdata”包中有interleave函数:

    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
    

    【讨论】:

      【解决方案2】:

      你可以通过给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")]
      

      【讨论】:

        【解决方案3】:

        这就是我的方法:

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

        do.call 在第一步中是不必要的,但使解决方案更具可扩展性。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2021-03-08
            • 1970-01-01
            • 2021-04-19
            • 1970-01-01
            • 2020-06-11
            • 1970-01-01
            • 1970-01-01
            • 2011-07-17
            • 2018-01-02
            相关资源
            最近更新 更多