[英]Filtering out duplicated/non-unique rows in data.table
2019 年編輯:此問題是在 2016 年 11 月更改data.table
之前提出的,請參閱下面接受的當前和以前方法的答案。
我有一個包含大約 250 萬行的data.table
表。 有兩列。 我想刪除在兩列中重復的任何行。 以前對於 data.frame 我會這樣做: df -> unique(df[,c('V1', 'V2')])
但這不適用於 data.table。 我試過unique(df[,c(V1,V2), with=FALSE])
但它似乎仍然只對 data.table 的鍵而不是整行進行操作。
有什么建議?
干杯,戴維
例子
>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
在上面的 data.table 中, 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")
對於 v1.9.8+ ( 2016 年 11 月發布)
從?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
之前的 v1.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
使用您的示例 data.table ...
> 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
因此,您可以列出表的列,然后根據@Andrie 的解決方案的要求,獲取該表的unique()
,而無需將鍵設置為所有列或將其刪除(通過將其設置為NULL
)(以及由@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
unique(df)
適用於您的示例。
這應該適合你
dt <- unique(dt, by = c('V1', 'V2'))
保留 data.table 表示法,您可以使用:
unique(df[, .(V1, V2, V3), nomatch=0 ])
如這里https://stackoverflow.com/a/31875208/10087503
我沒有比較這個和 Magma 版本的速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.