r语言 - 在新表中合并 2 列并删除重复项



嗨,我想合并表中的 2 列并在新表中创建一个唯一值列表。

例:数据集 = DT

Source    Destination
A          B
A          C
B          C

新表 (DT_New(

Unique names
A
B
C

我已经尝试使用以下代码:

DT_New <- unlist(DT)
DT_New<- data.table(DT_New)
DT_New = DT_New[!duplicated(DT_New), ]

当我使用此代码时,它返回以下结果:

新表 (DT_New(

Unique names
A
B
B
C

似乎上面的代码可以将"B"与列源和列目标区分开来。如何避免此问题并获取具有唯一值的表?

Unique names
A
B
C

您可以使用图形来存储数据(使用 igraph 包(,然后这些名称将与每个节点/顶点相关联:

library(igraph)
g = with(DT, graph_from_edgelist(cbind(Source, Destination)))
names(V(g))
# [1] "A" "B" "C"

您可以看到源>目标链接保留在边缘:

E(g)
# + 3/3 edges from 440136f (vertex names):
# [1] A->B A->C B->C

只需unlist并选择unique

data.table::data.table(unique_col = unique(unlist(DT)))
#   unique_col
#1:          A
#2:          B
#3:          C

或者使用您的duplicated方法,这将是

DT_New <- unlist(DT)
data.table(unique_col = DT_New[!duplicated(DT_New)])

对于较大的数据集,union是一个很好的途径。

data.table(unique_col = union(DT[['Source']], DT[['Destination']]))
#   unique_col
#1:          A
#2:          B
#3:          C
identical(data.table(unique_col = union(DT[['Source']], DT[['Destination']]))
          , data.table(unique_col = unique(unlist(DT))))
#[1] TRUE

下面是每列中有一百万条记录的示例:

set.seed(1)
DT <- data.table(Source = sample(1:1E6, 1E6, replace = T)
                 , Destination = sample(1:1E6 + 500000, 1E6, replace = T))
Unit: milliseconds
      expr       min        lq      mean    median        uq       max neval
  dt_union  173.2102  179.4019  281.2719  222.8879  395.7681  535.6448    20
 dt_unique 1271.1621 1487.0988 1581.3864 1582.5068 1682.7661 1842.5898    20

感谢您的所有输入。你所有的答案都是正确的,但没有解决我的特定问题。因此,我意识到问题应该出在数据准备代码中......显然,源列的每个值的末尾都有一个空格,这不会显示在 Rstudio 的表视图中。愚蠢的错误...

多亏了弗兰克斯的回答,我看到了空白。

最新更新