嗨,我想合并一个表中的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
答案 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的表视图中没有显示。愚蠢的错误...
感谢弗兰克斯的回答,我看到了空白。