首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列名传递给R中的函数,以使用函数排除某些列

将列名传递给R中的函数,以使用函数排除某些列
EN

Stack Overflow用户
提问于 2022-08-30 14:45:53
回答 2查看 39关注 0票数 0

我有一个长格式的数据集,该数据集包含a)按年份变化百分比的列,b)按年份进行绝对更改的列,以及c)其他数据。

我需要编写一个函数,根据我所调用的TRUE或FALSE参数的值,difference**排除包含PERC_CHANGE & EUR或名字为ABS_CHANGE & EUR的列,然后返回生成的数据帧**。

下面是可重复的代码块:

代码语言:javascript
复制
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))

这就是我的想法:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-30 14:52:55

您遗漏了几个括号(靠近contains),并将卷曲括号放错了位置(没有返回任何内容)。根据您的代码-尝试:

代码语言:javascript
复制
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)
}

输出:

代码语言:javascript
复制
# 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

更新:添加了输出。

票数 0
EN

Stack Overflow用户

发布于 2022-08-30 14:57:07

由于唯一的更改是'ABS‘vs 'PERC',我们可以将函数写为

代码语言:javascript
复制
test_func <- function(df, difference = TRUE) {
       nm <- if(difference) 'ABS_CHANGE' else 'PERC_CHANGE'
       df %>%
         select(-contains(nm), -contains("EUR"))
}

-testing

代码语言:javascript
复制
> 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

它可以是带有列名子字符串的参数,而不是不同的逻辑参数。在这种情况下,我们不需要任何if/else

代码语言:javascript
复制
test_function <- function(df, col_sub) {
    df %>%
       select(-contains(col_sub), -contains("EUR"))
}

然后测试为

代码语言:javascript
复制
test_function(df, "ABS_CHANGE")
test_function(df, "PERC_CHANGE")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73544379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档