根据R中的2列删除重复的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据R中的2列删除重复的行相关的知识,希望对你有一定的参考价值。

我是R.的新手。我有这个数据框:

TimeStamp  IndexA IndexB Value
12:00:01    1      NA    Windows
12:00:05    1      NA    Windows
12:00:13    1      NA    Windows
12:00:48    NA     1     Macintosh
12:01:30    NA     1     Macintosh
12:01:45    NA     1     Macintosh
12:02:01    2      NA    Windows
12:02:13    2      NA    Windows

我想删除基于IndexAValueIndexBValue列的重复行。所以,最后数据框应该是这样的:

TimeStamp  IndexA IndexB Value
12:00:01    1      NA    Windows
12:00:48    NA     1     Macintosh
12:02:01    2      NA    Windows

我该怎么办呢?

答案

为了完整起见,还可以使用unique()包中的data.table函数:

library(data.table)
unique(setDT(df), by = "IndexA")
   TimeStamp IndexA IndexB     Value
1:  12:00:01      1     NA   Windows
2:  12:00:48     NA      1 Macintosh
3:  12:02:01      2     NA   Windows

这只是在IndexA中寻找唯一值,这相当于Tito Sanz' answer。显然,这种方法返回给定样本数据集的预期结果,但仅检查一列重复条目是过度简化恕我直言,可能会因生产数据而失败。

或者,在三列中查找值的唯一组合(相当于www's answer):

unique(setDT(df), by = 2:4) # very terse
unique(setDT(df), by = c("IndexA", "IndexB", "Value")) # explicitely named cols
   TimeStamp IndexA IndexB     Value
1:  12:00:01      1     NA   Windows
2:  12:00:48     NA      1 Macintosh
3:  12:02:01      2     NA   Windows

Data

library(data.table)
df <- fread(
  "TimeStamp  IndexA IndexB Value
12:00:01    1      NA    Windows
12:00:05    1      NA    Windows
12:00:13    1      NA    Windows
12:00:48    NA     1     Macintosh
12:01:30    NA     1     Macintosh
12:01:45    NA     1     Macintosh
12:02:01    2      NA    Windows
12:02:13    2      NA    Windows")
另一答案

使用dplyr的解决方案。我们可以使用distinct函数。在考虑重复时,-TimeStamp指定此列被排除。 .keep_all = TRUE意味着保留所有列。

library(dplyr)

dt2 <- dt %>%
  distinct(-TimeStamp, .keep_all = TRUE)
dt2
# # A tibble: 3 x 4
#   TimeStamp IndexA IndexB     Value
#       <chr>  <int>  <int>     <chr>
# 1  12:00:01      1     NA   Windows
# 2  12:00:48     NA      1 Macintosh
# 3  12:02:01      2     NA   Windows

数据

dt <- read.table(text = "TimeStamp  IndexA IndexB Value
12:00:01    1      NA    Windows
                 12:00:05    1      NA    Windows
                 12:00:13    1      NA    Windows
                 12:00:48    NA     1     Macintosh
                 12:01:30    NA     1     Macintosh
                 12:01:45    NA     1     Macintosh
                 12:02:01    2      NA    Windows
                 12:02:13    2      NA    Windows",
                 header = TRUE, stringsAsFactors = FALSE)
另一答案

你可以在distinct包中使用tidyverse函数。

foo %>% 
  distinct(IndexA, .keep_all = T)

结果如下:

  TimeStamp IndexA IndexB     Value
1  12:00:01      1     NA   Windows
2  12:00:48     NA      1 Macintosh
3  12:02:01      2     NA   Windows

以上是关于根据R中的2列删除重复的行的主要内容,如果未能解决你的问题,请参考以下文章

根据条件从 r 中的多列中删除重复的行

根据条件对 BigQuery 中的行进行重复数据删除

根据列中的值重复行

R - 根据两列识别和删除重复行

有条件地删除R中的行

如何根据谷歌表格中的名称删除重复的行?