仅使用部分列名称在dplyr的列上操作

时间:2017-12-08 00:30:17

标签: r dplyr

我有一个使用`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结尾的列名。有一些方法可以使用整个列名的字符串表示来操作,但使用某种匹配更为棘手。 select()中的dplyr函数可以使用ends_with()等函数选择列。但是如何在其他dplyr动词中实现这一点,例如arrange()

1 个答案:

答案 0 :(得分:2)

您可以使用范围动词arrange_at;对于您的情况,请将arrange_atvars +选择帮助函数%>% 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