【问题标题】:Filter across all columns after a specific string在特定字符串之后过滤所有列
【发布时间】:2022-07-01 21:26:32
【问题描述】:

如果我可以在任何列中找到字符串Code,我的目标是过滤我的数据。它应该在第一次出现这个词时过滤。

我正在处理一个列表,包含Code 的列会根据它们的排列而变化。所以我需要一个通用的方法来做这个尝试。

一些示例数据:

# A tibble: 11 × 10
   `Title:`            `A&E weekly activity statistics, NHS…` ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10
   <chr>               <chr>                                  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 Contact:            Paul Steele - Unify2@dh.gsi.gov.uk     NA    NA    NA    NA    NA    NA    NA    NA   
 2 NA                  NA                                     NA    NA    NA    NA    NA    NA    NA    NA   
 3 Provider Level Data NA                                     NA    NA    NA    NA    NA    NA    NA    NA   
 4 NA                  NA                                     NA    A&E … NA    NA    NA    A&E … NA    NA   
 5 SHA                 Code                                   Name  Type… Type… Type… Tota… Type… Type… Type…
 6 -                   -                                      Engl… 2831… 12906 1369… 4330… 15347 34    172  
 7 NA                  NA                                     NA    NA    NA    NA    NA    NA    NA    NA   
 8 Q30                 RLN                                    City… 1423  669   297   2389  202   0     18   
 9 Q30                 RXP                                    Coun… 2473  0     2088  4561  89    0     0    
10 Q30                 5J9                                    Darl… 0     0     0     0     0     0     0    
11 Q30                 RR7                                    Gate… 1251  0     0     1251  24    0     0  

我的尝试:

vf %>% filter(row_number() >= across(everything(), ~ .x %>% which(. == 'Code')))

我收到以下错误:

Error in `filter()`:
! Problem while computing `..1 = row_number() >= ...`.
Caused by error in `across()`:
! Problem while computing column `Title:`.
Caused by error in `which()`:
! argument to 'which' is not logical
Run `rlang::last_error()` to see where the error occurred.

预期输出:

# A tibble: 7 × 10
  `Title:` `A&E weekly activity statistics, NHS and indepen…` ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10
  <chr>    <chr>                                              <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 SHA      Code                                               Name  Type… Type… Type… Tota… Type… Type… Type…
2 -        -                                                  Engl… 2831… 12906 1369… 4330… 15347 34    172  
3 NA       NA                                                 NA    NA    NA    NA    NA    NA    NA    NA   
4 Q30      RLN                                                City… 1423  669   297   2389  202   0     18   
5 Q30      RXP                                                Coun… 2473  0     2088  4561  89    0     0    
6 Q30      5J9                                                Darl… 0     0     0     0     0     0     0    
7 Q30      RR7                                                Gate… 1251  0     0     1251  24    0     0    

可重现的代码:

structure(list(`Title:` = c("Contact:", NA, "Provider Level Data", 
NA, "SHA", "-", NA, "Q30", "Q30", "Q30", "Q30"), `A&E weekly activity statistics, NHS and independent sector organisations in England` = c("Paul Steele - Unify2@dh.gsi.gov.uk", 
NA, NA, NA, "Code", "-", NA, "RLN", "RXP", "5J9", "RR7"), ...3 = c(NA, 
NA, NA, NA, "Name", "England", NA, "City Hospitals Sunderland NHS Foundation Trust", 
"County Durham And Darlington NHS Foundation Trust", "Darlington PCT", 
"Gateshead Health NHS Foundation Trust"), ...4 = c(NA, NA, NA, 
"A&E attendances", "Type 1 Departments - Major A&E", "283175", 
NA, "1423", "2473", "0", "1251"), ...5 = c(NA, NA, NA, NA, "Type 2 Departments - Single Specialty", 
"12906", NA, "669", "0", "0", "0"), ...6 = c(NA, NA, NA, NA, 
"Type 3 Departments - Other A&E/Minor Injury Unit", "136985", 
NA, "297", "2088", "0", "0"), ...7 = c(NA, NA, NA, NA, "Total attendances", 
"433066", NA, "2389", "4561", "0", "1251"), ...8 = c(NA, NA, 
NA, "A&E attendances > 4 hours from arrival to admission, transfer or discharge", 
"Type 1 Departments - Major A&E", "15347", NA, "202", "89", "0", 
"24"), ...9 = c(NA, NA, NA, NA, "Type 2 Departments - Single Specialty", 
"34", NA, "0", "0", "0", "0"), ...10 = c(NA, NA, NA, NA, "Type 3 Departments - Other A&E/Minor Injury Unit", 
"172", NA, "18", "0", "0", "0")), row.names = c(NA, -11L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

    标签: r


    【解决方案1】:

    如果包含这样的字符串,您可以使用str_detect across 所有列:

    library(dplyr)
    library(stringr)
    vf %>%
      filter(if_all(everything(), ~!str_detect(., "Code")))
    #> # A tibble: 5 × 10
    #>   `Title:` `A&E weekly activit…` ...3  ...4  ...5  ...6  ...7  ...8  ...9  ...10
    #>   <chr>    <chr>                 <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
    #> 1 -        -                     Engl… 2831… 12906 1369… 4330… 15347 34    172  
    #> 2 Q30      RLN                   City… 1423  669   297   2389  202   0     18   
    #> 3 Q30      RXP                   Coun… 2473  0     2088  4561  89    0     0    
    #> 4 Q30      5J9                   Darl… 0     0     0     0     0     0     0    
    #> 5 Q30      RR7                   Gate… 1251  0     0     1251  24    0     0
    

    由reprex package (v2.0.1) 于 2022-07-01 创建

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多