2014-02-07 192 views
1

我對使用匹配函數得到的輸出有個疑問。我有兩個數據幀,它們的行數和行數不同。我希望從前兩個數據幀中獲得兩個新的數據框,其中沒有行/ rownames。要做到這一點的方法之一是一個數據框的rownames匹配到其他在R中匹配兩個數據幀

這裏是我的代碼如下至今:現在

x_1 <- c("A1", "A1", "B10", "B10", "B10", "B10", "C100", "C100", "C100", "C100") 

y_1 <- round(seq(1, 24, length = 10), 2) 

A <- data.frame(x_1, y_1) 



x_2 <- c("A1", "B10", "C100", "D1", "D200", "G210") 

y_2 <- round(seq(1, 24, length = 6), 2) 

B <- data.frame(x_2, y_2) 

,A和B都在rownames不一樣的,我希望做出新A和B版本,但刪除了所有不同的rownames。

m_1 <- names(table(A$x_1)) 
m_2 <- names(table(B$x_2)) 

comb_names <- union(m_1[!(m_1 %in% m_2)], m_2[!(m_2 %in% m_1)]) 

A_1 <- A[!A$x_1 %in% c(comb_names), ] 
B_1 <- B[!B$x_2 %in% c(comb_names), ] 
newB_1 <- B_1[match(A_1$x_1, B_1$x_2), ] 

newB_1是B_1的數據幀已經從A_1

再配上rownames

我的問題是,當我輸入代碼names(table(newB_1$x_2)),我仍然得到B_1中所有的原始rownames這應該是用此代碼刪除B_1 <- B[!B$x_2 %in% c(comb_names), ]。但是,當我輸入newB_1時,它會給我正確的輸出。

names(table(newB_1$x_2)) 
"A1" "B10" "C100" "D1" "D200" "G210" 

newB_1 
x_2 y_2 
A1 1.0 
A1 1.0 
B10 5.6 
B10 5.6 
B10 5.6 
B10 5.6 
C100 10.2 
C100 10.2 
C100 10.2 
C100 10.2 

事實上,同樣的事情適用於names(table(B_1$x_2))這表明B_1 <- B[!B$x_2 %in% c(comb_names), ]心不是刪除包含在comb_names名字上面給出。

table(B_1$x_2) 

A1 B10 C100 D1 D200 G210 
1 1 1 0 0 0 

最後的問題是我如何可以完全刪除不常見的兩種dataframes A和B,使得我最終等於rownames兩個dataframes的rownames?即我不希望名稱D1,D200和G210出現在新數據幀中。

我希望上述內容有道理,但我會很樂意澄清任何含糊之處。我想知道如何修改我的代碼以獲得所需的輸出,但也可以複製其他可以複製結果的替代代碼。

+2

嘗試使用'as.character'從一個因素改變rownames一個字符。即使你放棄了一些,因素水平也會保留下來。 – tcash21

+1

我認爲你在這裏複雜的任務或者我誤解了你想做什麼。 「合併(A,B,by = 1)'(A,B原始沒有設置名稱)是你正在尋找什麼? – agstudy

+0

@ agstudy,那真是太棒了!它似乎解決了這個問題。我不知道爲什麼我花了這麼長時間才碰到合併功能。 –

回答

2

我可能會誤解,但是這不會做你想做的事情(即每個data.frame只有第一列的值存在於另一列的第一列)?

A[A$x_1 %in% B$x_2,] 
#  x_1 y_1 
# 1 A1 1.00 
# 2 A1 3.56 
# 3 B10 6.11 
# 4 B10 8.67 
# 5 B10 11.22 
# 6 B10 13.78 
# 7 C100 16.33 
# 8 C100 18.89 
# 9 C100 21.44 
# 10 C100 24.00 
B[B$x_2 %in% A$x_1,] 
# x_2 y_2 
# 1 A1 1.0 
# 2 B10 5.6 
# 3 C100 10.2 

另外,如果你想將它們連接起來,您可以使用這兩種方法:

cbind(A, y_2=B[match(A$x_1, B$x_2), "y_2"]) 
merge(A, B, by=1) # 

與第一個比第二快,雖然雙方產生相同的輸出。 match方法要快得多,但有一個限制,即B表必須在您加入的內容(這裏是這種情況)上是唯一的。

#  x_1 y_1 y_2 
# 1 A1 1.00 1.0 
# 2 A1 3.56 1.0 
# 3 B10 6.11 5.6 
# 4 B10 8.67 5.6 
# 5 B10 11.22 5.6 
# 6 B10 13.78 5.6 
# 7 C100 16.33 10.2 
# 8 C100 18.89 10.2 
# 9 C100 21.44 10.2 
# 10 C100 24.00 10.2  

最後,這種複製newB_1

B[match(A$x_1, B$x_2), ] 
#  x_2 y_2 
# 1  A1 1.0 
# 1.1 A1 1.0 
# 2 B10 5.6 
# 2.1 B10 5.6 
# 2.2 B10 5.6 
# 2.3 B10 5.6 
# 3 C100 10.2 
# 3.1 C100 10.2 
# 3.2 C100 10.2 
# 3.3 C100 10.2  
+0

@ BrodieG,非常感謝您的回答。看起來像merge是唯一的函數,當你輸出這個命令(names(table(output $ rownameheader))時,它會產生正確的結果。但是不知道爲什麼其他方法產生錯誤的輸出。 –