【问题标题】:combining rows based on a condition in R根据 R 中的条件组合行
【发布时间】:2021-10-30 15:14:00
【问题描述】:

我正在尝试从下面的df 中删除一些无用的行。每个 ID 可以有一个 type (1:5) 和 yes_no 变量,以查看是否记录了变量。如您所见,我想删除第 3 行和第 5 行,因为它们的其他行具有相同的 IDtype,记录值为 yes_no = y

df <- data.frame(ID = c("1", "1", "1", "1", "1", "1", "1", "1"), type = c("1", "2", "3", "3", "4", "4", "4", "5"), yes_no = c("n", "n", "n", "y", "n", "y", "y", "n"), value = c(NA, NA, NA, "2", NA, "5", "6", NA))

 ID type yes_no value
  1    1      n  <NA>
  1    2      n  <NA>
  1    3      n  <NA>
  1    3      y     2
  1    4      n  <NA>
  1    4      y     5
  1    4      y     6
  1    5      n  <NA>

想要的输出如下:

df2 <- data.frame(ID = c("1", "1", "1", "1", "1", "1"), type = c("1", "2", "3", "4", "4", "5"), yes_no = c("n", "n", "y", "y", "y", "n"), value = c(NA, NA, "2", "5", "6", NA))

 ID type yes_no value
  1    1      n  <NA>
  1    2      n  <NA>
  1    3      y     2
  1    4      y     5
  1    4      y     6
  1    5      n  <NA>

除了 1 之外,还有其他 ID 的类型为 1:5,所以看起来我必须 group_by(ID)dplyr 解决方案也很棒。

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: r dataframe dplyr filtering subset


    【解决方案1】:

    在按“ID”、“类型”分组后,我们可以对filter 使用OR (|) 条件来过滤存在“y”或all 元素不是“y”的组

    library(dplyr)
    df %>% 
       group_by(ID, type) %>% 
       filter(yes_no == 'y'|all(yes_no != 'y')) %>% 
       ungroup
    

    -输出

    # A tibble: 6 x 4
      ID    type  yes_no value
      <chr> <chr> <chr>  <chr>
    1 1     1     n      <NA> 
    2 1     2     n      <NA> 
    3 1     3     y      2    
    4 1     4     y      5    
    5 1     4     y      6    
    6 1     5     n      <NA> 
    

    【讨论】:

      【解决方案2】:

      使用subset + ave 的基本 R 选项

      subset(
        df,
        ave(yes_no == "y", ID, type, FUN = max) == (yes_no == "y")
      )
      

      给予

        ID type yes_no value
      1  1    1      n  <NA>
      2  1    2      n  <NA>
      4  1    3      y     2
      6  1    4      y     5
      7  1    4      y     6
      8  1    5      n  <NA>
      

      【讨论】:

        【解决方案3】:

        您可以使用if 条件来检查yes_no 是否具有any y 值。

        library(dplyr)
        
        df %>%
          group_by(ID, type) %>%
          filter(if(any(yes_no == 'y')) yes_no == 'y' else TRUE) %>%
          ungroup
        
        #  ID    type  yes_no value
        #  <chr> <chr> <chr>  <chr>
        #1 1     1     n      NA   
        #2 1     2     n      NA   
        #3 1     3     y      2    
        #4 1     4     y      5    
        #5 1     4     y      6    
        #6 1     5     n      NA   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-31
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          • 1970-01-01
          • 1970-01-01
          • 2021-11-28
          相关资源
          最近更新 更多