【问题标题】:Operate on column with dplyr given only partial column name使用 dplyr 对列进行操作,仅给出部分列名
【发布时间】:2017-12-08 08:42:29
【问题描述】:

我有一个使用`dplyr处理许多不同数据帧的函数,如下所示:

some_function <- function(some_data){

    processed_data = some_data %>%
        group_by(session_id) %>% 
        arrange(some_date) %>% 
        mutate(n = row_number()) %>%
        filter(n == 1) %>%
        select(-n)    
} 

传递给函数的数据帧每个共享几个关键列名称,但其他的不同。在这个函数中,我一般只处理共享列名,所以引用它们很简单。

例外情况是希望arrange() 通过一些在数据帧中系统地不同的变量。例如它可能是在一个数据框中名为 a_date 而在另一个数据框中名为 b_date 的列。

所以我想对以_date 结尾的列名进行操作。有一些方法可以对整个列名的字符串表示进行操作,但使用某种匹配会比较棘手。 dplyr 中的 select() 函数可以使用 ends_with() 等函数选择列。但是如何在其他dplyr 动词中实现这一点,例如arrange()

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以使用作用域动词arrange_at;对于您的情况,使用 arrange_atvars + 选择辅助函数 %&gt;% arrange_at(vars(ends_with('_date')))


    示例

    df <- data.frame(a_date = c(3,1,4,4), b_date = c(1,3,4,2))
    

    a_date列上排列:

    arrange_at(df, vars(starts_with('a')))
    #  a_date b_date
    #1      1      3
    #2      3      1
    #3      4      4
    #4      4      2
    

    b_date列上排列:

    arrange_at(df, vars(starts_with('b')))
    #  a_date b_date
    #1      3      1
    #2      4      2
    #3      1      3
    #4      4      4
    

    a_date 列上排列,然后在b_date 上排列:

    arrange_at(df, vars(ends_with('date')))
    #  a_date b_date
    #1      1      3
    #2      3      1
    #3      4      2
    #4      4      4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 2018-08-03
      • 2014-03-26
      • 2018-05-10
      • 1970-01-01
      • 2017-12-22
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多