2017-08-06 68 views
-1

我們希望將數據框中的某些列與來自各種不同數據框的匹配列合併。我們的主要數據幀預測看起來如下:添加來自不同數據框的列並在兩個指標上堆疊

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

(有可能根據預測的數量更多的列中運行)

我們的目標是合併與從y列該數據幀三種不同的測試數據幀(df_1df_2df_3)它們都具有相同的結構。通過df_1$y[test]([test]是一個邏輯向量來標識與我們的x值匹配的5個值)並且具有與從預測的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軸列成一列,以做評估下一步。按照正確的順序堆疊它們很重要,例如x1下的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

數據

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 
+0

謝謝@Moody_mudskipper。我從中學到了一些有用的基本東西。還有一個問題:sapply命令中的「sub」究竟做了什麼? – Dima

+0

它用相關'data.frame'第一列名稱中的空字符串替換任何數字。我做了一個複製粘貼錯誤,輸出的打印名稱是錯誤的,我現在用x和y替換它們:)。 –

+0

我剛剛注意到的另一件事是,使用'unlist'創建*輸出*將我的原始x值從(0,1)轉換爲(1,2)。 有什麼建議嗎? – Dima

相關問題