嗨,我想合并表中的 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 的表视图中。愚蠢的错误...
多亏了弗兰克斯的回答,我看到了空白。