添加来自不同数据框的列并堆叠在两个指标上

Add columns from different data frames and stack on two indicators

我们想将数据框中的某些列与来自各种不同数据框中的匹配列合并。我们的主要数据框 predict 如下所示:

>predict
 x1    x2    x3
 1     1     1
 0     1     0
 1     1     0
 1     1     0
 0     0     1

(可能会有更多列,具体取决于预测运行的数量)

我们的目标是将此数据框与来自三个不同 test 数据框的 y 列合并(df_1 df_2df_3) 都具有相同的结构。通过 df_1$y[test] 访问所需的列([test] 是一个逻辑向量,它标识与我们的 x 值匹配的 5 个值)并且具有与来自 predict[= 的 x 列相同的结构35=].

所需的输出如下所示:

>predict_test
 x1    x2    x3    y1    y2    y3 
 1     1     1     1     1     1
 0     1     0     0     0     0
 1     1     0     0     1     0
 1     1     0     1     1     1
 0     0     1     0     0     1

在下一步中,我们需要将 x 和 y 列堆叠成一列以便进行评估。以正确的顺序堆叠它们很重要,即 x2 在 x1 下,x3 在 x2 下。分别为 y 列。

>predict_test_stack
 x_all y_all
 1     1
 0     0
 1     0
 1     1
 0     0
 1     1
 1     0
 1     1
 1     1
 0     0
 1     1
 0     0
 0     0
 0     1
 1     1

这可能适用于 melt,但我们不知道如何在指示两个不同的 id 变量时应用它。

感谢您的帮助。

数据

df1 <- read.table(text = "x1    x2    x3
1     1     1
0     1     0
1     1     0
1     1     0
0     0     1",stringsAsFactors = FALSE,header=TRUE)

df2 <- read.table(text = "y1    y2    y3
1     1     1
0     0     0
0     1     0
1     1     1
0     0     1",stringsAsFactors = FALSE,header=TRUE)

解决方案

我们连接 data.frames,然后取消列出 data.frame,保持正确的列数。最后,我们通过进入 data.frames 找到模式来设置名称。

list1 <- list(df1,df2)
side_by_side <- data.frame(list1)
#   x1 x2 x3 y1 y2 y3
# 1  1  1  1  1  1  1
# 2  0  1  0  0  0  0
# 3  1  1  0  0  1  0
# 4  1  1  0  1  1  1
# 5  0  0  1  0  0  1

output <- data.frame(matrix(unlist(side_by_side),ncol = length(list1)))
names(output) <- sapply(list1,function(x){sub("[[:digit:]]","",names(x)[1])})
#     x  y
# 1   1  1
# 2   0  0
# 3   1  0
# 4   1  1
# 5   0  0
# 6   1  1
# 7   1  0
# 8   1  1
# 9   1  1
# 10  0  0
# 11  1  1
# 12  0  0
# 13  0  0
# 14  0  1
# 15  1  1