我對使用匹配函數得到的輸出有個疑問。我有兩個數據幀,它們的行數和行數不同。我希望從前兩個數據幀中獲得兩個新的數據框,其中沒有行/ 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出現在新數據幀中。
我希望上述內容有道理,但我會很樂意澄清任何含糊之處。我想知道如何修改我的代碼以獲得所需的輸出,但也可以複製其他可以複製結果的替代代碼。
嘗試使用'as.character'從一個因素改變rownames一個字符。即使你放棄了一些,因素水平也會保留下來。 – tcash21
我認爲你在這裏複雜的任務或者我誤解了你想做什麼。 「合併(A,B,by = 1)'(A,B原始沒有設置名稱)是你正在尋找什麼? – agstudy
@ agstudy,那真是太棒了!它似乎解決了這個問題。我不知道爲什麼我花了這麼長時間才碰到合併功能。 –