【问题标题】:Delete duplicate rows based on condition in another column根据另一列中的条件删除重复行
【发布时间】:2021-06-22 02:14:40
【问题描述】:

假设我有这个数据框:

df <- data.frame(
  a = c(NA,6,6,8),
  x= c(1,2,2,4),
  y = c(NA,2,NA,NA),
  z = c("apple", 2, "2", NA), 
  d = c(NA, 5, 5, 5),stringsAsFactors = FALSE)

第 2 行和第 3 行是重复的,第 3 行具有 NA 值。我想删除具有 NA 值的重复行,使其看起来像这样:

df <- data.frame(
  a = c(NA,6,8),
  x= c(1,2,4),
  y = c(NA,2,NA),
  z = c("apple", 2, NA), 
  d = c(NA, 5, 5),stringsAsFactors = FALSE)

我试过了,但它不起作用:

  
df2 <- df %>% group_by (a,x,z,d) %>% filter(y == max(y))

有什么建议吗?

【问题讨论】:

    标签: r


    【解决方案1】:
    df %>%
       arrange_all() %>%
       filter(!duplicated(fill(., everything())))
       a x  y     z  d
    1 NA 1 NA apple NA
    2  6 2  2     2  5
    3  8 4 NA  <NA>  5
    

    【讨论】:

      【解决方案2】:
      df %>% arrange(a,x,z,d) %>% distinct(a,x,z,d,.keep_all=TRUE)
      
         a x  y     z  d
      1  6 2  2     2  5
      2  8 4 NA  <NA>  5
      3 NA 1 NA apple NA
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      【解决方案3】:

      用以前的非 NA 填充 NA 值,并用 distinct 选择唯一行。

      library(dplyr)
      library(tidyr)
      
      df %>% fill(everything()) %>% distinct()
      
      #   a x  y     z  d
      #1 NA 1 NA apple NA
      #2  6 2  2     2  5
      #3  8 4 NA  <NA>  5
      

      【讨论】:

      • 谢谢!有没有办法在没有填充和不同的情况下做到这一点?有 group_by 或 filter 的东西吗?
      • group_by 不能直接工作,因为NA 可以在任何列中,而不仅仅是y,并且它们具有不同的值。你可以使用df %&gt;% fill(everything()) %&gt;% group_by(across()) %&gt;% slice(1L)
      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 2021-09-09
      • 2020-04-13
      • 2018-12-01
      • 2016-07-11
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多