簡體   English   中英

將列名稱傳遞給 R 中的 function 以使用 function 排除某些列

[英]Passing column name to a function in R to exclude certain columns using a function

我有一個長格式的數據集,其中包含 a) 列按年份變化的百分比,b) 具有按年份絕對變化的列,此外 c) 其他數據。

我需要編寫一個 function ,根據我調用的 TRUE 或 FALSE 參數的值difference ,排除名稱中包含PERC_CHANGE & EURABS_CHANGE & EUR的列,然后返回結果 dataframe

這是可重現的代碼塊:

df=structure(list(SCENARIO = c("BC", "BC", "BC", "BC"), INSTITUTE = c("BCR", 
"BCR", "BCR", "BCR"), METHOD_DEC = c("BIL", "CARLA", 
"CARLA", "CARLA"), CLASS = c("SME", "BANK", "CORPORATE", 
"SME"), EUR_Y_2021 = c(13446986L, 0L, 0L, 0L), EUR_Y_2022 = c(16460885L, 
133047L, 728991L, 665L), ABS_CHANGE_N_2021 = c(0L, 0L, 0L, 0L
), ABS_CHANGE_N_2022 = c(1815796L, -1039290L, 2768626L, -499L
), PERC_CHANGE_N_2022 = c(0.0227073699984259, -0.00992854123296549, 
0.0608814672317806, -0.233723653395784), PERC_CHANGE_N_2023 = c(0.0722801890040687, 
-0.0115649941812915, 0.145799497480829, -0.402341920374707)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -4L), groups = structure(list(
    CLASS = c("BANK", "CORPORATE", "SME", "SME"), METHOD_DEC = c("CARLA", 
    "CARLA", "BIL", "CARLA"), INSTITUTE = c("BCR", "BCR", 
    "BCR", "BCR"), SCENARIO = c("BC", "BC", "BC", "BC"), .rows = structure(list(
        2L, 3L, 1L, 4L), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -4L), .drop = TRUE))

這就是我的想法:

test_func <- function(df, difference) {
    if (difference==TRUE) {
        df=df %>% select(-contains("ABS_CHANGE" | contains("EUR"))
       } else {                 
        df=df %>% select(-contains("PERC_CHANGE" | contains("EUR"))
                            }
       }
return (df)

 test_func(df,difference=FALSE)

您錯過了一些括號(在contains附近)並放錯了大括號(沒有返回任何內容)。 根據您的代碼 - 嘗試:

test_func <- function(df, difference) {
    if (difference==TRUE) {
        df=df %>% select(-(contains("ABS_CHANGE") | contains("EUR")))
    } else {          
        df=df %>% select(-(contains("PERC_CHANGE") | contains("EUR")))
    }
return (df)
}

Output:

# A tibble: 4 × 6
# Groups:   CLASS, METHOD_DEC, INSTITUTE, SCENARIO [4]
  SCENARIO INSTITUTE METHOD_DEC CLASS     PERC_CHANGE_N_2022 PERC_CHANGE_N_2023
  <chr>    <chr>     <chr>      <chr>                  <dbl>              <dbl>
1 BC       BCR       BIL        SME                  0.0227              0.0723
2 BC       BCR       CARLA      BANK                -0.00993            -0.0116
3 BC       BCR       CARLA      CORPORATE            0.0609              0.146 
4 BC       BCR       CARLA      SME                 -0.234              -0.402 

# A tibble: 4 × 6
# Groups:   CLASS, METHOD_DEC, INSTITUTE, SCENARIO [4]
  SCENARIO INSTITUTE METHOD_DEC CLASS     ABS_CHANGE_N_2021 ABS_CHANGE_N_2022
  <chr>    <chr>     <chr>      <chr>                 <int>             <int>
1 BC       BCR       BIL        SME                       0           1815796
2 BC       BCR       CARLA      BANK                      0          -1039290
3 BC       BCR       CARLA      CORPORATE                 0           2768626
4 BC       BCR       CARLA      SME                       0              -499

更新:添加了 output。

由於唯一的變化是“ABS”與“PERC”,我們可以將 function 寫為

test_func <- function(df, difference = TRUE) {
       nm <- if(difference) 'ABS_CHANGE' else 'PERC_CHANGE'
       df %>%
         select(-contains(nm), -contains("EUR"))
}

-測試

> test_func(df)
# A tibble: 4 × 6
# Groups:   CLASS, METHOD_DEC, INSTITUTE, SCENARIO [4]
  SCENARIO INSTITUTE METHOD_DEC CLASS     PERC_CHANGE_N_2022 PERC_CHANGE_N_2023
  <chr>    <chr>     <chr>      <chr>                  <dbl>              <dbl>
1 BC       BCR       BIL        SME                  0.0227              0.0723
2 BC       BCR       CARLA      BANK                -0.00993            -0.0116
3 BC       BCR       CARLA      CORPORATE            0.0609              0.146 
4 BC       BCR       CARLA      SME                 -0.234              -0.402 
> test_func(df, FALSE)
# A tibble: 4 × 6
# Groups:   CLASS, METHOD_DEC, INSTITUTE, SCENARIO [4]
  SCENARIO INSTITUTE METHOD_DEC CLASS     ABS_CHANGE_N_2021 ABS_CHANGE_N_2022
  <chr>    <chr>     <chr>      <chr>                 <int>             <int>
1 BC       BCR       BIL        SME                       0           1815796
2 BC       BCR       CARLA      BANK                      0          -1039290
3 BC       BCR       CARLA      CORPORATE                 0           2768626
4 BC       BCR       CARLA      SME                       0              -499

它可以是列名稱為 substring 的參數,而不是不同的邏輯參數。 在這種情況下,我們不需要任何if/else

test_function <- function(df, col_sub) {
    df %>%
       select(-contains(col_sub), -contains("EUR"))
}

然后測試為

test_function(df, "ABS_CHANGE")
test_function(df, "PERC_CHANGE")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM