将两个宽框架绑定到 R 中的面板中

Bind two wide frames into panel in R

我有两个数据帧,每个数据帧对应于我想绑定在一起的不同时间段。同一个变量有不同的变量名,但帧的顺序是第一帧的第二列对应第二帧的第二列,等等。例如:

set.seed(123)
f1 <- data.frame(name = c("a", "b", "c"), t = c(1,1,1), x1 = sample(0:10,3), x2 =  sample(0:10,3))
f2 <- data.frame(name = c("a", "b", "c"),  t = c(2,2,2), y1 = sample(0:10,3), y2 =  sample(0:10,3))

我想将它们绑定到 name 变量上,以便它生成如下数据集:

  name t v1 v2
1    a 1  3  9
2    a 2  5  5
3    b 1  7 10
4    b 2  8  9
5    c 1 10  0
6    c 2  4  4

任何关于如何重塑框架而不必考虑像这样的变量名的建议都会很棒。谢谢

colnames(f1) <- colnames(f2)
x <- rbind(f2, f1)     
x <- x[order(x$name, x$t),]
> x
name t y1 y2
4    a 1  3  9
1    a 2  5  5
5    b 1  7 10
2    b 2  8  9
6    c 1 10  0
3    c 2  4  4

data.table 包有一个 rbind 方法,它有 use.names 参数,可以设置为 FALSE 以忽略不同的列名。

library(data.table) # V 1.9.6+
rbind(setDT(f1), setDT(f2), use.names = FALSE)[order(name)]
#    name t x1 x2
# 1:    a 1  3  9
# 2:    a 2  5  5
# 3:    b 1  7 10
# 4:    b 2  8  9
# 5:    c 1 10  0
# 6:    c 2  4  4