ヌル距離の結果として正確な重複行(IDなし)を好きではない統計ルーチンがあります。重複したID /キーのマッピングテーブルを作成する
私は最初に削除した重複を検出し、ルーチンを適用して、別の場所に残したレコードをマージします。
私はID /キーとしてrownames
を使用することを考えてみましょう。
私は基本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
Iは、単純またはより効果的な方法は、(data.table
/dplyr
受け入れ)があるかどうかを疑問に思います。提案する代替案?
ありがとう!印象的な、それはどのように簡潔です。これを検証し、 'data.table'を使うコードの一部を書き直します。 「by」列を指定する別の方法が必要な場合はどうすればよいですか?私はグローバルID列(キーとして設定される)を持ち、最初にプロセスから削除する必要があります - 私の重複マッピングプロセスは明らかにこのID列なしで機能しなければならないためです。 –
@エリック。 'cols = setdiff(names(data)、" ID ")'を実行し、 'by = cols'や' .SDcols = cols'のようなcolを渡すことができます。これらの引数を渡すためのさまざまなオプションは、 '?data.table'で取り上げられています。それらの多くがあります。また、私のメモhttp://franknarf1.github.io/r-tutorial/_book/tables.html#program-tablesの「列の指定」のリストにある – Frank