R rbind,同时保留每个数据帧中的顺序或行

R rbind,同时保留每个数据帧中的顺序或行,r,rbind,R,Rbind,我需要合并2个数据帧,同时保留它们在每个数据帧中的外观顺序: x = data.frame(a=1:3, b=2:4, c=3:5) y = data.frame(a=c(10, 20, 30), b=c(20, 30, 40), c=c(30, 40, 50)) 我想要的是: > z a b c 1 2 3 10 20 30 2 3 4 20 30 40 3 4 5 30 40 50 但是rbind所做的是在第一个数据帧下添加第二个数据

我需要合并2个数据帧,同时保留它们在每个数据帧中的外观顺序:

x = data.frame(a=1:3, b=2:4, c=3:5)
y = data.frame(a=c(10, 20, 30), b=c(20, 30, 40), c=c(30, 40, 50))
我想要的是:

> z 

a   b   c
1   2   3
10  20  30
2   3   4
20  30  40
3   4   5
30  40  50

但是rbind所做的是在第一个数据帧下添加第二个数据帧。

您应该在每个数据帧中添加行号变量,并在绑定后按此变量排序。使用
dplyr
可以按如下方式执行此操作:

library(dplyr)

x %>%
  mutate(rn = row_number()) %>%
  bind_rows(
    y %>%
      mutate(rn = row_number())
  ) %>%
  arrange(rn)%>%
  select(-4)

您可以在base
R
中使用Paweł的行号思想:

x$rowid <- seq(1, nrow(x)*2, by = 2) # or simply 1:nrow(x)
y$rowid <- seq(2, nrow(y)*2, by = 2)
z <- rbind(x, y)
z[order(z$rowid),]

   a  b  c rowid
1  1  2  3     1
4 10 20 30     2
2  2  3  4     3
5 20 30 40     4
3  3  4  5     5
6 30 40 50     6
x$rowid试试这一行

do.call("rbind", Map("rbind", split(x, 1:nrow(x)), split(y, 1:nrow(y))))
如果
x
y
与问题中相同,则给出此数据框:

      a  b  c
1.1   1  2  3
1.2  10 20 30
2.2   2  3  4
2.21 20 30 40
3.3   3  4  5
3.31 30 40 50
它按行拆分每个数据帧,然后将rbind拆分的相应组件。然后它就把这一切都毁了。请注意,即使柱具有不同的类型,此内衬也可以工作。例如,即使:

x <- data.frame(a = letters[1:3], b = 1:3, c = c(TRUE, FALSE, TRUE))
y <- data.frame(a = LETTERS[1:3], b = 11:13, c = c(FALSE, TRUE, FALSE))

x作为另一个基本r版本:

x=data.frame(a=1:3,b=2:4,c=3:5)
y=数据帧(a=c(10,20,30),b=c(20,30,40),c=c(30,40,50))
mapply(FUN=函数(i,j){rbind(i,j)},x,y)
#>a、b、c
#> [1,]  1  2  3
#> [2,] 10 20 30
#> [3,]  2  3  4
#> [4,] 20 30 40
#> [5,]  3  4  5
#> [6,] 30 40 50

(v0.2.1)于2019年2月14日创建,仅为完整起见,也是一个
数据表
解决方案

library(data.table)
dt.x <- data.table(x)
dt.y <- data.table(y)
dt.x[,Row.Num :=seq(1:.N)]
dt.y[,Row.Num :=seq(1:.N)]
rbindlist(list(dt.x,dt.y), idcol = TRUE)[order(Row.Num),]
库(data.table)

dt.x始终具有相同的行数?
library(data.table)
dt.x <- data.table(x)
dt.y <- data.table(y)
dt.x[,Row.Num :=seq(1:.N)]
dt.y[,Row.Num :=seq(1:.N)]
rbindlist(list(dt.x,dt.y), idcol = TRUE)[order(Row.Num),]