我有一個統計例程,不喜歡行精確重複(無ID)作爲結果爲空距離。創建一個映射表的重複的ID /鍵
因此,我首先檢測到我刪除的重複項,應用我的例程並將記錄合併回原處。
爲簡單起見,請考慮使用rownames
作爲ID /密鑰。
我發現下面的方式來實現我的結果在基礎R:
data <- data.frame(x=c(1,1,1,2,2,3),y=c(1,1,1,4,4,3))
# check duplicates and get their ID -- cf. https://stackoverflow.com/questions/12495345/find-indices-of-duplicated-rows
dup1 <- duplicated(data)
dupID <- rownames(data)[dup1 | duplicated(data[nrow(data):1, ])[nrow(data):1]]
# keep only those records that do have duplicates to preveng running folowing steps on all rows
datadup <- data[dupID,]
# "hash" row
rowhash <- apply(datadup, 1, paste, collapse="_")
idmaps <- split(rownames(datadup),rowhash)
idmaptable <- do.call("rbind",lapply(idmaps,function(vec)data.frame(mappedid=vec[1],otherids=vec[-1],stringsAsFactors = FALSE)))
這給了我我想要的東西,即重複數據(容易)和映射表。
> (data <- data[!dup1,])
x y
1 1 1
4 2 4
6 3 3
> idmaptable
mappedid otherids
1_1.1 1 2
1_1.2 1 3
2_4 4 5
不知是否有一個更簡單的或更有效的方法(data.table
/dplyr
接受)。任何替代建議?
謝謝!令人印象深刻的是它簡潔。我打算驗證這一個,重寫部分代碼以使用'data.table'。如果我想用另一種方式指定「by」列,該怎麼辦?我將有一個全局ID列(設置爲鍵),我將不得不首先將它從進程中移除 - 因爲我的重複映射過程顯然必須在沒有此ID列的情況下工作。 –
@Eric Sure。你可以做'cols = setdiff(names(data),「ID」)',然後傳遞col ='cols'和'.SDcols = cols'。 ''data.table'包含傳遞這些參數的各種選項。有很多。我在我的筆記中還有一個列表http://franknarf1.github.io/r-tutorial/_book/tables.html#program-tables下的「指定列」 – Frank