【问题标题】:Remove duplicate rows in one column based on another column and keep other columns intact根据另一列删除一列中的重复行并保持其他列不变
【发布时间】:2018-03-24 19:11:20
【问题描述】:

我已经尝试了很多在这里找到的解决方案,但没有一个可以正常工作; unique 函数让我最接近。我的数据如下:

id   second   var1   var2
100   20       3      4
100   21       3      3
100   22       4      3
100   23       4      3
100   24       4      4 
100   22       3      3
100   23       3      3

它通常每 300 秒左右重复大约 10 秒。每个会话大约是 1200 秒。我想在会话中删除重复的秒数,并取 var1 和 var 2 中被折叠的任何内容的平均值,或者如果不是保持原始值的平均值,则可以。如果 var1 和 var2 不唯一,我尝试过的所有操作都会删除重复项?

【问题讨论】:

  • aggregate(. ~ id+second, mydata, mean)

标签: r dataframe duplicates


【解决方案1】:

这将创建一个符合您要求的新数据框。

解释一下,你实际上不需要删除任何东西,你只需要按公共值分组 val1/2s,在本例中为 id 和 second。

library(tidyverse)

new_df <- df %>%
  group_by(id, second) %>%
  summarise(var1 = mean(var1),
            var2 = mean(var2)
            )

【讨论】:

    【解决方案2】:

    您可以使用base-R 函数来做到这一点:

    aggregate(. ~ id+second, dat, mean)
    
    ##    id second var1 var2
    ## 1 100     20  3.0    4
    ## 2 100     21  3.0    3
    ## 3 100     22  3.5    3
    ## 4 100     23  3.5    3
    ## 5 100     24  4.0    4
    

    使用dplyr 包可以完成(类似于以前的答案,稍作调整):

    library(dplyr)
    dat %>% group_by(id, second) %>% 
            summarise_all(mean)
    
    ## # A tibble: 5 x 4
    ## # Groups:   id [?]
    ##      id second  var1  var2
    ##   <int>  <int> <dbl> <dbl>
    ## 1   100     20   3.0     4
    ## 2   100     21   3.0     3
    ## 3   100     22   3.5     3
    ## 4   100     23   3.5     3
    ## 5   100     24   4.0     4
    

    如果您想根据两列(键)删除重复项,data.table 包将是一个不错的选择:

    library(data.table)
    unique(setDT(dat), by = c('id','second'))
    
    #     id second var1 var2
    # 1: 100     20    3    4
    # 2: 100     21    3    3
    # 3: 100     22    4    3
    # 4: 100     23    4    3
    # 5: 100     24    4    4
    

    数据:

     dat <- structure(list(id = c(100L, 100L, 100L, 100L, 100L, 100L, 100L                       
         ), second = c(20L, 21L, 22L, 23L, 24L, 22L, 23L), var1 = c(3L,                          
         3L, 4L, 4L, 4L, 3L, 3L), var2 = c(4L, 3L, 3L, 3L, 4L, 3L, 3L)), .Names = c("id",        
         "second", "var1", "var2"), .internal.selfref = <pointer: 0x02af24a0>, row.names = c(NA, 
         7L), class = c("data.table", "data.frame"))
    

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 2014-07-23
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      相关资源
      最近更新 更多