在新表格中合并2列并删除重复项

时间:2019-06-04 07:06:15

标签: r duplicates data.table

嗨,我想合并一个表中的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

4 个答案:

答案 0 :(得分:2)

只需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)])

答案 1 :(得分:1)

对于较大的数据集,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

答案 2 :(得分:1)

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

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

您会看到Source-> Destination链接保留在边缘:

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

答案 3 :(得分:0)

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

感谢弗兰克斯的回答,我看到了空白。