Отфильтровывание дублированных / неуникальных строк в данных.стол
у меня есть data.table
таблица с примерно 2,5 миллиона строк. Есть две колонки. Я хочу удалить все строки, которые дублируются в обоих столбцах. Ранее для данных.кадр я бы так и сделал:
df -> unique(df[,c('V1', 'V2')])
но это не работает с данными.стол. Я пробовал unique(df[,c(V1,V2), with=FALSE])
но он, кажется, все еще работает только на ключе данных.таблица, а не вся строка.
какие предложения?
Ура, Дэви
пример
>dt
V1 V2
[1,] A B
[2,] A C
[3,] A D
[4,] A B
[5,] B A
[6,] C D
[7,] C D
[8,] E F
[9,] G G
[10,] A B
в выше данные.таблица где V2
это ключ таблицы, только строки 4,7 и 10 будут удалены.
> dput(dt)
structure(list(V1 = c("B", "A", "A", "A", "A", "A", "C", "C",
"E", "G"), V2 = c("A", "B", "B", "B", "C", "D", "D", "D", "F",
"G")), .Names = c("V1", "V2"), row.names = c(NA, -10L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x7fb4c4804578>, sorted = "V2")
3 ответа:
до В1.9.8
С
?unique.data.table
понятно, что вызовunique
в таблице данных работает только на ключ. Это означает, что вы должны сбросить ключ ко всем столбцам перед вызовомunique
.library(data.table) dt <- data.table( V1=LETTERS[c(1,1,1,1,2,3,3,5,7,1)], V2=LETTERS[c(2,3,4,2,1,4,4,6,7,2)] )
вызов
unique
С одним столбцом в качестве ключа:setkey(dt, "V2") unique(dt) V1 V2 [1,] B A [2,] A B [3,] A C [4,] A D [5,] E F [6,] G G
для v1.9. 8+
С
?unique.data.table
По умолчанию используются все столбцы (что согласуется с?unique.data.frame
)unique(dt) V1 V2 1: A B 2: A C 3: A D 4: B A 5: C D 6: E F 7: G G
или с помощью
by
аргумент для того, чтобы получить уникальные комбинации конкретных столбцов (как ранее ключи были использованы для)unique(dt, by = "V2") V1 V2 1: A B 2: A C 3: A D 4: B A 5: E F 6: G G
С вашим примером данных.стол...
> dt<-data.table(V1 = c("B", "A", "A", "A", "A", "A", "C", "C", "E", "G"), V2 = c("A", "B", "B", "B", "C", "D", "D", "D", "F", "G")) > setkey(dt,V2)
рассмотрим следующие тесты:
> haskey(dt) # obviously dt has a key, since we just set it [1] TRUE > haskey(dt[,list(V1,V2)]) # ... but this is treated like a "new" table, and does not have a key [1] FALSE > haskey(dt[,.SD]) # note that this still has a key [1] TRUE
Итак, вы можете перечислить столбцы таблицы, а затем взять
unique()
этого, без необходимости устанавливать ключ ко всем столбцам или отбрасывать его (установив его вNULL
) в соответствии с решением от @Andrie (и отредактировано @MatthewDowle). Решения, предложенные @Pop и @Rahul, не работали для меня.см. попытку 3 ниже, которая очень похожа на вашу начальная попытка. Ваш пример не был ясен, поэтому я не уверен, почему это не сработало. Также это было несколько месяцев назад, когда вы разместили вопрос, так что, возможно,
data.table
обновился?> unique(dt) # Try 1: wrong answer (missing V1=C and V2=D) V1 V2 1: B A 2: A B 3: A C 4: A D 5: E F 6: G G > dt[!duplicated(dt)] # Try 2: wrong answer (missing V1=C and V2=D) V1 V2 1: B A 2: A B 3: A C 4: A D 5: E F 6: G G > unique(dt[,list(V1,V2)]) # Try 3: correct answer; does not require modifying key V1 V2 1: B A 2: A B 3: A C 4: A D 5: C D 6: E F 7: G G > setkey(dt,NULL) > unique(dt) # Try 4: correct answer; requires key to be removed V1 V2 1: B A 2: A B 3: A C 4: A D 5: C D 6: E F 7: G G