按行甚至奇数元素组合数据帧

时间:2017-10-17 11:07:01

标签: r dataframe

我有两个数据框:

> df1 <- data.frame(a=3:4, b=1:2)
> df2 <- data.frame(a=5:6, b=7:8)
>
> df1
  a b
1 3 1
2 4 2
>
> df2
  a b
1 5 7
2 6 8

如何按行组合(或压缩或交错),以便结果如下:

> df_final <- some_magic_function(df1, df2)
> df_final
1 3 1
2 5 7
3 4 2
4 6 8

我发现了类似的方法herethere,但它适用于矢量:

> a <- c(1, 2, 3)
> b <- c(4, 5, 6)
>
> a
[1] 1 2 3
> b
[1] 4 5 6
>
> as.vector(rbind(a,b))
[1] 1 4 2 5 3 6
>
> z1 <- setNames(c(a,b),rep(seq_along(a),2))
> z1 <- as.vector(z1[order(names(z1))]) 
> z1
[1] 1 4 2 5 3 6
>
> c( matrix(c(a,b), nrow=2, byrow=TRUE) ) 
[1] 1 4 2 5 3 6
>
> c(a,b)[ order( c(seq_along(a), seq_along(b)))] 

如何为数据框做类似的事情?请注意我想交错行,而不是连接数据帧,然后以某种方式重新排列它的行。

3 个答案:

答案 0 :(得分:2)

试试这个:

as.data.frame.matrix(mapply(function(x,y){rbind(x,y)},df1,df2))

#  a b
#1 3 1
#2 5 7
#3 4 2
#4 6 8

Reduce(function(x,y){rbind(x,y)},(sapply(1:nrow(df1),
 functio‌​n(i,x,y){rbind(x[i,]‌​,y[i,])},df1,df2,sim‌​plify = FALSE)))

答案 1 :(得分:2)

这些保留了列类型,但其中2个依赖于内部ggplot2函数。

简单方法:

gdata::interleave(df1, df2)

艰难的方式:

基地:

do.call(
  cbind.data.frame, 
  setNames(
    lapply(
      colnames(df1), 
        function(x) { 
          ggplot2:::interleave(df1[,x], df2[,x])
        }
    ), colnames(df1)
  )
)

Tidyverse:

library(tidyverse)

map(colnames(df1), ~ggplot2:::interleave(df1[,.x], df2[,.x])) %>% 
  set_names(colnames(df1)) %>% 
  bind_cols()

答案 2 :(得分:1)

稍微过度拟合的矢量化解决方案可能是,

full_d <- rbind(df1, df2)
rbind(full_d[c(TRUE, FALSE),], full_d[c(FALSE, TRUE),])