【问题标题】:Filtering for Duplicated Names with Conditional Statements in R - Reprex在 R 中使用条件语句过滤重复名称 - Reprex
【发布时间】:2023-01-24 03:01:37
【问题描述】:

我有一个大型数据库,其中有部分重复的行。我正在尝试在 dplyr 中使用带有条件语句的过滤器来删除这些部分重复的行。

目标:我想删除所有存在 a1 和 id1 的重复组合且 var1 等于 0 的行。为此,我尝试在我的过滤器函数中使用 duplicated() 调用以及条件语句。

问题:我在下面使用的下面的代码似乎忽略了 var1 等于零的最后一个条件。我尝试了两种不同的过滤方式来获得想要的结果,但无济于事。我的 duplicated() 调用有问题吗?我应该改用 distinct() 吗?

library(dplyr)
a1 <- c('adam', 'adam', 'adam', 'megan', 'megan', 'megan', 'jen', 'jen', 'jen')
id1 <- c('a', 'a', 'b', 'a', 'b', 'b', 'a', 'b', 'c')
var1 <- as.numeric(c('0', '3.2', '3', '2.2', '1.1', '0', '1.2', '2.4','3.1'))
test_df <- data.frame(a1, id1, var1)

#code to get rid of duplicates
test_df2 <- test_df %>%
  filter(!(duplicated(id1) & duplicated(a1) & var1 == 0))

#alternative code
test_df3 <- test_df
test_df3$new_id <- with(test_df3, paste0(a1, sep = "-", id1))

test_df3 <- test_df3 %>%
  filter(!(duplicated(new_id) & var1 == 0))

这是我得到的照片:

这是期望的结果:

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用group_bysummarise

    librar(dplyr)
    test_df %>% 
      group_by(a1, id1) %>% 
      summarise(var1 = sum(var1))
    
     a1    id1    var1
      <chr> <chr> <dbl>
    1 adam  a       3.2
    2 adam  b       3  
    3 jen   a       1.2
    4 jen   b       2.4
    5 jen   c       3.1
    6 megan a       2.2
    7 megan b       1.1
    

    【讨论】:

    • 谢谢@Tarjae - 这是一个有用的选择。虽然这适用于我的 reprex,但它不一定适用于我的数据库,因为我有额外的变量列无法求和。有没有办法根据过滤条件省略行?
    【解决方案2】:

    我能够通过使用 Janitor 的 get_dupes 然后从该子集进行过滤来解决这个问题。我不确定为什么我不能在 dplyr 中使用条件语句来实现这一点,但这是一种效果很好的 hack。

    library(janitor)
    library(dplyr)
    
    a1 <- c('adam', 'adam', 'adam', 'megan', 'megan', 'jen', 'jen', 'jen')
    id1 <- c('a', 'b', 'a','a', 'b', 'a', 'b', 'a')
    var1 <- as.numeric(c('3.2', '2.7', '0','2', '1.1', '0', '2.2','3.1'))
    var2 <- as.numeric(c('3.4', '3', '0','1.7', '1.2', '3', '0','3.3'))
    test_df <- data.frame(a1, id1, var1, var2)
    test_df$a1_id1 <- with(test_df, paste0(a1, sep = "-", id1))
    
    #get all instances where there is a duplicated name and id
    test_df2 <- test_df %>%
      get_dupes(a1_id1)
    
    #remove rows that have var1 as 0 and remove column called dupe_count
    test_df3 <- test_df2 %>%
      filter(var1 != 0) %>%
      select(-dupe_count)
    
    #Remove all instances of duplicate names
    test_df4 <- test_df %>%
      group_by(a1_id1) %>%
      filter(n() == 1)
    
    #combine the two df's created and bind together for the desired output.
    test_df_updated <- dplyr::bind_rows(test_df3, test_df4)
    

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 1970-01-01
      • 2014-10-23
      • 2014-06-16
      • 2013-05-06
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多