当前位置: 首页 > 知识库问答 >
问题:

筛选出data.table中的重复/非唯一行

邵星河
2023-03-14

编辑2019:此问题是在数据更改之前提出的。表2016年11月,当前方法和以前方法的接受答案如下。

我有一个<code>数据。表约有250万行的表。有两列。我想删除两列中重复的任何行。之前的数据。帧我会这样做:<code>df-

有什么建议吗?

干杯,戴维

>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中,其中< code>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个答案

施翰学
2023-03-14

unique(df)适用于您的示例。

白博易
2023-03-14

使用您的示例数据。表。。。

> 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的解决方案(并由@MatthewDowle编辑)的要求将键设置为所有列或删除它(通过将其设置为NULL)。@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
苍志文
2023-03-14

对于v1.9.8(2016年11月发布)

来自<代码>?unique.data.table默认情况下使用所有列(这与< code >一致?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中,很明显,在数据表上调用唯一只对键有效。这意味着您必须在调用唯一之前重置所有列的键。

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)]
)

以一列作为键调用一:

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
 类似资料:
  • 我有一个对象数组,如何在TypeScript/JavaScript中筛选唯一id数组 列表数组-

  • 我使用了将我的数据帧过滤为两列“Worker”和“Time Type”。 示例数据集 我现在只想看到那些“兼职”或“全职”的输出。 到目前为止,我构建的代码是: 但是我得到了错误 有人知道一个简单的方法来解决这个问题吗? 理想情况下,我想以两件事结束: > 显示全职和兼职员工的输出。 另一个显示此参数以外异常的输出,即第2行中的“Tom”显示“paert Tme”,这是一个异常,值得作为单独的输出

  • 我有数据。下表 我想按组查找每列中唯一值的总和。 我尝试了以下内容,它给了我每列中所有值的总和(但不是唯一值)。 然而,我只想找到唯一值的和。 答案应该是这样的- 谢谢

  • 我在一个java类中定义某些变量,然后用另一个类访问它,以便在流中筛选唯一的元素。请参阅代码以更好地理解该问题。 我面临的问题是这个过滤函数不能很好地工作,无法过滤唯一的事件。我怀疑这个变量在不同的线程之间是共享的,它是原因!?如果这不是正确的方法,请建议另一种方法。提前道谢。

  • 问题内容: 尝试插入子文档时出现MongoDB错误。子文档已经具有唯一的_id,但是对于另一个我不想唯一的非唯一字段抛出了错误。 Angular中的错误是:“ Assets.serial已存在”。 如何使该字段包含重复值,是什么导致模型假设它应该是唯一的? 这是我的猫鼬模型: 这是我的“保存”方法: 第一次插入文档时,它工作正常。任何后续时间,它都会失败并显示400,因为assets.serial

  • 问题内容: 我有下表,我必须从中获取非唯一行 我想获取column的所有行,至少在两行中具有相同的值。 上表查询的输出必须为 我尝试了以下请求,但均未成功: 问题答案: 尝试这个: 您发布的数据的结果: