我有两个数据框:
> 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
> 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)))]
如何为数据框做类似的事情?请注意我想交错行,而不是连接数据帧,然后以某种方式重新排列它的行。
答案 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),
function(i,x,y){rbind(x[i,],y[i,])},df1,df2,simplify = 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),])