data.table 根据切换的字符串组合加入
data.table join based on switched string combinations
我有 df1
,我想根据公共字段 id
与 df2
合并
id
始终采用 21_2342_A_C
的形式(即 num_num_char_char
)。如果 id
中的最后两个字段 (sep="_")
中的任何一个被切换,我想将 df2
合并到 df1
中。
所以,如果 df1
中的 ID
是 21_2342_A_C
,那么如果 df2
中的条目是 21_2342_A_C
或 [,我希望它匹配=26=].
这可以使用 data.table 吗?我开发了一种繁琐的方法,涉及创建两个不同的列并进行两个不同的连接,但我希望有一个更优雅的解决方案。我也很乐意采用非 data.table 解决方案。
这还包括创建两个额外的列,但只有 1 个合并:
dt <- data.table(
id = c("21_2342_A_C", "21_2342_C_A", "21_2342_A_B")
)
- 提取id的数字和字符部分
- 对字符部分进行排序
- 如果数字和字符部分相同则合并
- 删除自身合并and/or重复合并(如果第 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]
如果没有中间 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")
我有 df1
,我想根据公共字段 id
df2
合并
id
始终采用 21_2342_A_C
的形式(即 num_num_char_char
)。如果 id
中的最后两个字段 (sep="_")
中的任何一个被切换,我想将 df2
合并到 df1
中。
所以,如果 df1
中的 ID
是 21_2342_A_C
,那么如果 df2
中的条目是 21_2342_A_C
或 [,我希望它匹配=26=].
这可以使用 data.table 吗?我开发了一种繁琐的方法,涉及创建两个不同的列并进行两个不同的连接,但我希望有一个更优雅的解决方案。我也很乐意采用非 data.table 解决方案。
这还包括创建两个额外的列,但只有 1 个合并:
dt <- data.table(
id = c("21_2342_A_C", "21_2342_C_A", "21_2342_A_B")
)
- 提取id的数字和字符部分
- 对字符部分进行排序
- 如果数字和字符部分相同则合并
- 删除自身合并and/or重复合并(如果第 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]
如果没有中间 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")