【问题标题】:Remove duplicated rows based on 2 columns in R根据 R 中的 2 列删除重复的行
【发布时间】:2018-05-30 13:05:41
【问题描述】:

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

我该如何管理?

【问题讨论】:

  • 请发布您目前尝试过的代码。另外,stackoverflow.com/questions/13742446/… 似乎可能重复
  • @Tanu 我确信已经在 SO 上提出过类似的问题,但是您链接到的 Q 不是重复的,恕我直言。在链接的 Q 所有行中,包含重复条目的行将被删除,而这里的第一个条目将被保留。
  • 感谢@Uwe 指出。

标签: r dataframe duplicates


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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。显然,这种方法返回给定样本数据集的预期结果,但仅检查 one 列是否有重复条目过于简化恕我直言,并且可能会因生产数据而失败。

    或者,寻找三个列中值的唯一组合(相当于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")
    

    【讨论】:

      【解决方案3】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 2021-06-24
        • 2021-05-13
        • 2016-07-11
        • 2016-12-02
        • 2016-07-27
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多