如何删除数据框中的所有重复记录,以便不留下任何一个?

38

有一个类似的问题适用于PHP,但我正在使用R并且无法将解决方案翻译成我的问题。

我有一个数据帧,它有10行和50列,其中一些行是完全相同的。如果对其使用unique,则每个“类型”只得到一行,但我想要的实际上是仅获取出现一次的行。有谁知道如何实现这一点吗?

我可以查看聚类和热图来手动排序,但我有比上面提到的更大的数据框(最多100行),这会变得有点棘手。

3个回答

88
这将提取仅出现一次的行(假设您的数据框命名为 df):

这将提取仅出现一次的行(假设您的数据框命名为 df):

df[!(duplicated(df) | duplicated(df, fromLast = TRUE)), ]

工作原理:函数duplicated测试一行是否至少从第一行开始出现第二次。如果使用参数fromLast = TRUE,则函数会从最后一行开始。

两个布尔结果使用|(逻辑或)组合成一个新向量,表示所有出现多次的行。然后使用!取反该结果,从而创建一个布尔向量,表示仅出现一次的行。


12

一个涉及到dplyr的可能性是:

df %>%
 group_by_all() %>%
 filter(n() == 1)

或者:

df %>%
 group_by_all() %>%
 filter(!any(row_number() > 1))

dplyr 1.0.0 开始,更可取的方式是:

data %>%
    group_by(across(everything())) %>%
    filter(n() == 1)

1
尝试一下。
library(dplyr)

DF1 <- data.frame(Part = c(1,2,3,4,5), Age = c(23,34,23,25,24),  B.P = c(87,76,75,75,78))

DF2 <- data.frame(Part =c(3,5), Age = c(23,24), B.P = c(75,78))

DF3 <- rbind(DF1,DF2)

DF3 <- DF3[!(duplicated(DF3) | duplicated(DF3, fromLast = TRUE)), ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接