【问题标题】:Combine 2 columns in a new table and remove duplicates在新表中合并 2 列并删除重复项
【发布时间】:2019-06-04 07:06:15
【问题描述】:

您好,我想合并一个表中的 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”与列 Source 和列目标区分开来。如何避免此问题并获得具有唯一值的表?

Unique names
A
B
C

【问题讨论】:

  • 试试unique(unlist(df))
  • 用你的代码我得到了想要的结果。
  • 我也得到了预期的输出。见这里:library(data.table); DT &lt;- data.frame(Source= c("A", "A", "B"), Destination= c("B", "C", "C")); DT_New &lt;- unlist(DT); DT_New&lt;- data.table(DT_New); DT_New = DT_New[!duplicated(DT_New), ]; DT_NewA B C

标签: r duplicates data.table


【解决方案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

【讨论】:

    【解决方案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)])
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        感谢 Franks 的回答,我看到了空格。

        【讨论】:

          猜你喜欢
          • 2020-05-20
          • 1970-01-01
          • 2016-10-24
          • 2010-11-22
          • 2015-11-29
          • 1970-01-01
          • 2017-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多