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

时间:2017-12-16 15:40:31

标签: r dataframe duplicates

我是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

我该如何管理?

3 个答案:

答案 0 :(得分:4)

使用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)

答案 1 :(得分:2)

为了完整起见,也可以使用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相当的唯一值。显然,这种方法会返回给定样本数据集的预期结果,但只检查一个列中的重复条目会过度简化IMHO,并且可能会因生产数据而失败。

或者,在三个列(相当于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

数据

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

答案 2 :(得分:0)

您可以在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