我有df1我想df2基于一個共同領域合并的id
id總是采用21_2342_A_C(ie num_num_char_char) 的形式。如果最后兩個欄位中的任何一個被切換,我想合并df2。df1(sep="_")id
所以,如果IDindf1是21_2342_A_C,那么我希望它匹配 in 的條目df2是21_2342_A_Cor 21_2342_C_A。
這可能使用data.table嗎?我開發了一種繁瑣的方法,涉及創建兩個不同的列并執行兩個不同的連接,但我希望有一個更優雅的解決方案。我也很樂意采用非 data.table 解決方案。
uj5u.com熱心網友回復:
這還包括創建兩個額外的列,但只有 1 個合并:
dt <- data.table(
id = c("21_2342_A_C", "21_2342_C_A", "21_2342_A_B")
)
- 提取id的數字和字符部分
- 排序字符部分
- 如果數字和字符部分相同,則合并
- 洗掉自身的合并和/或重復的合并(如果第 i 行合并到第 j 行,則第 j 行合并到第 i 行)
dt[, row_id := seq_len(.N)]
dt[, (c("id1", "id2")) := transpose(str_extract_all(dt$id, "([0-9]{2}_[0-9]{4})|([A-Z]_[A-Z])"))]
dt[, id2 := map_chr(str_split(id2, "_"), ~str_c(sort(.x), collapse = ""))]
res <- dt[dt, on = .(id1, id2)][row_id < i.row_id]
res[, c("row_id", "id1", "id2", "i.row_id") := NULL]
uj5u.com熱心網友回復:
如果沒有中間 ID,我也無法弄清楚如何做到這一點。這是我的看法:
df1 <- data.table(V1= "hello", id= "21_2342_A_C")
df2 <- data.table(V1= c("world1", "world2"), id= c("21_2342_A_C", "21_2342_C_A"))
sort_id <- function(x)
{
x <- unlist(tstrsplit(x, "_"))
return(paste0(c(x[1:2], sort(x[3:4])), collapse= "_"))
}
df1[, id2:= sort_id(id), id]
df2[, id2:= sort_id(id), id]
merge(df1,
df2,
"id2")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442196.html
