【问题标题】:How to keep one instance or more of the values in one column when removing duplicate rows?删除重复行时如何在一列中保留一个或多个值?
【发布时间】:2020-07-01 02:19:01
【问题描述】:

我正在尝试删除数据框的一列中具有重复值的行。我想确保表示该列中的所有现有值,如果其在另一列中的值不重复且不丢失,则出现多次,并且仅在另一列中的值全部丢失时出现一次。以如下数据框为例:

toy <- data.frame(Group = c(1,1,2,2,2,3,3,4,5,5,6,7,7), Class = c("a",NA,"a","b",NA,NA,NA,NA,"a","b","a","a","a"))

我想这样结束:

ideal <- data.frame(Group = c(1,2,2,3,4,5,5,6,7), Class = c("a","a","b",NA,NA,"a","b","a","a"))

我尝试将数据框转换为数据表并按照here的建议进行操作,如下所示:

library(data.table)
toy.dt <- as.data.table(toy)
toy.dt[, .(Class = if(all(is.na(Class))) NA_character_ else na.omit(Class)), by = Group]

但未按需要处理重复项:“组”列中的值 7 应仅在结果数据中出现一次。

如果解决方案不需要将数据转换为数据表,那将是一个奖励。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是使用基数 R 的一种方法。我们首先将 NA 行删除到 toy 中,然后只选择唯一的行。然后,我们可以使用唯一的 Group 值左连接它以获取 NA 的行 group

    df1 <- unique(na.omit(toy))
    merge(unique(subset(toy, select = Group)), df1, all.x = TRUE)
    
    
    #  Group Class
    #1     1     a
    #2     2     a
    #3     2     b
    #4     3  <NA>
    #5     4  <NA>
    #6     5     a
    #7     5     b
    #8     6     a
    #9     7     a
    

    使用dplyr 函数的相同逻辑:

    library(dplyr)
    toy %>%
      na.omit() %>%
      distinct() %>%
      right_join(toy %>% distinct(Group))
    

    【讨论】:

      【解决方案2】:

      如果您想尝试tidyverse 方法:

      library(tidyverse)
      
      toy %>%
        group_by(Group) %>%
        filter(!(is.na(Class) & sum(!is.na(Class)) > 0)) %>%
        distinct()
      

      输出

      # A tibble: 9 x 2
      # Groups:   Group [7]
        Group Class
        <dbl> <chr>
      1     1 a    
      2     2 a    
      3     2 b    
      4     3 NA   
      5     4 NA   
      6     5 a    
      7     5 b    
      8     6 a    
      9     7 a 
      

      【讨论】:

        猜你喜欢
        • 2014-06-23
        • 2016-10-28
        • 1970-01-01
        • 2021-12-28
        • 2022-01-17
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多