添加来自不同数据框的列并堆叠在两个指标上
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_2 和 df_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
我们想将数据框中的某些列与来自各种不同数据框中的匹配列合并。我们的主要数据框 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_2 和 df_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