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

时间:2017-08-06 21:17:51

标签: r dataframe merge melt

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

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

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

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

所需的输出如下所示:

>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下的x2和x2下的x3。分别为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变量。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

数据

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