【问题标题】:Subset data frame based on non matching value in a columns基于列中非匹配值的子集数据框
【发布时间】:2022-11-22 22:17:15
【问题描述】:

我有一个数据框如下

year district
2017 arrah
2017 buxar
2017 rohtas
2018 rohtas
2018 arwal
2018 seohar
2019 nawda
2019 buxar
2019 jamui

我想以 2018 年或 2019 年的重复地区不应出现在子集中的方式对数据进行子集化,如下所示

year district
2017 arrah
2017 buxar
2017 rohtas
2018 arwal
2018 seohar
2019 nawda
2019 jamui

我试过 anti_join 功能,但它没有解决我的问题。

【问题讨论】:

  • 请指定哪些行以及为什么应保留在子集中。例如,您为什么选择2017 buxar而不是2019 buxar

标签: r dplyr group-by


【解决方案1】:

dplyr

library(dplyr)
quux %>%
  group_by(district) %>%
  slice_min(year) %>%
  ungroup()
# # A tibble: 7 x 2
#    year district
#   <int> <chr>   
# 1  2017 arrah   
# 2  2018 arwal   
# 3  2017 buxar   
# 4  2019 jamui   
# 5  2019 nawda   
# 6  2017 rohtas  
# 7  2018 seohar  

基础R

quux[ave(quux$year, quux$district, FUN = function(y) y == min(y)) > 0, ]
#   year district
# 1 2017    arrah
# 2 2017    buxar
# 3 2017   rohtas
# 5 2018    arwal
# 6 2018   seohar
# 7 2019    nawda
# 9 2019    jamui

数据

quux <- structure(list(year = c(2017L, 2017L, 2017L, 2018L, 2018L, 2018L, 2019L, 2019L, 2019L), district = c("arrah", "buxar", "rohtas", "rohtas", "arwal", "seohar", "nawda", "buxar", "jamui")), class = "data.frame", row.names = c(NA, -9L))

【讨论】:

    【解决方案2】:

    这是每个地区最早年份的样本子集记录。您可以选择其他排列(聚合)功能:

    library(dplyr)
    df <- data.frame(
      year = c ( 
        2017, 
        2017, 
        2017,
        2018, 
        2018, 
        2018, 
        2019, 
        2019, 
        2019
      ),
      district = c (
        "arrah",
        "buxar",
        "rohtas",
        "rohtas",
        "arwal",
        "seohar",
        "nawda",
        "buxar",
        "jamui"
      )
    )
    
    
    df %>% group_by(district) %>% 
      arrange(year = min(year))
    

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多