2017-06-13 61 views
1

我試圖在兩列(每行)中測試相等性。但是,我的數據不是數字。我正在使用的數據集合是從兩個數據集中合併而來的。通過數據我發現,應該是相同的列實際上是不同的。這是一個非常大的數據集(大約300K obs),所以我試圖編碼。在兩列(因子/字符數據)中逐行測試是否相等

E.g. Source.x來自合併函數中的第一個數據集,Source.y來自合併函數中的第二個數據集。

RightID Source.x Source.y 
1000  Ground  Unnamed Stream 
1001  Ground  Ground 
1002  Stream  Stream 
1003  Bear Creek Ground 

我想返回一個新的數據幀,因爲它們只包含觀測值1000和1003。我曾嘗試下面的代碼...

lapply(rights, rights$Source.x == rights$Source.y 
filter(rights, rights$Source.x == rights$Source.y 
filter(rights, identical(Source.x, Source.y) 

但是,因爲數據是在要素/字符格式,並有不同程度的因源名稱的變化,沒有我的代碼管理工作。 Source.x擁有6743個等級,Source.y擁有6457個等級。據我所知,我的問題沒有公佈的解決方案,詳細闡述了這個等級問題。如果任何人有任何建議,將不勝感激。

+0

爲避免出現因素,當您讀取數據時可以使用'stringsAsFactors = F'選項,或者如果您使用'dplyr',則可以使用'data_frame'將字符串列保留爲字符串。 – rconradin

回答

0

levels <- sort(unique(unlist(rights[, c('source.x', 'source.y')]))) rights$source.x <- factor(rights$source.x, levels = levels) rights$source.y <- factor(rights$source.y, levels = levels) result <- rights[rights$source.x == rights$source.y, ]

可以使它們是一致的每個因素指定水平。只需使用兩列創建一個唯一的級別列表。

+0

嗨@troh,感謝您的意見。代碼運行得很好,但結果產生了一個有286 K行的空數據框(相當於權限數據庫中的行數)。有任何想法嗎? – DPek

+0

我已經更新了我的答案。 '=='可能是你想使用的而不是'相同的' – troh

相關問題