Привет, я хотел бы объединить 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
с вашим кодом я получаю желаемый результат.
Я также получаю ожидаемый результат. Смотрите здесь:library(data.table); DT <- data.frame(Source= c("A", "A", "B"), Destination= c("B", "C", "C")); DT_New <- unlist(DT); DT_New<- data.table(DT_New); DT_New = DT_New[!duplicated(DT_New), ]; DT_New
дает A 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
Вы можете использовать график для хранения данных (с пакетом 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
Спасибо за все Ваши ответы. Все ваши ответы были правильными, но не решали мою конкретную проблему. Поэтому я понял, что проблема должна быть в коде подготовки данных... Судя по всему, в конце каждого значения исходного столбца был пробел, который не отображается в табличном представлении Rstudio. Глупая ошибка...
Благодаря ответу Фрэнка я увидел пробел.
Попробуйте
unique(unlist(df))
.