2015-03-27 2 views
2

Мне нужна функция, которая использует dplyr и выглядит примерно как AddPercentColumns().Как передать столбец для упорядочивания() и mutate()

AddPercentColumns <- function(df, col) { 
    # Sorts and adds "Percent" and "Cumulative Percent" columns to a data.frame. 
    # 
    # Args: 
    # df: data frame 
    # col: column symbol 
    # 
    # Returns: 
    # Data frame sorted by "col" with new "Percent" and "Cumulative Percent" columns. 

    df %>% 
     arrange(desc(col)) %>% 
     mutate(Percent = col/sum(col) * 100) %>% 
     mutate(Cumulative = cumsum(Percent)) 
} 

Тем не менее, у меня возникают проблемы с обмотанием головы вокруг того, как обходить NSE. Я мог бы передать строку имени столбца и использовать arrange_() и mutate_(), но тогда я не уверен, что делать с desc(), sum() и cumsum().

Как эту функцию следует написать с помощью dplyr?

+0

Спасибо, Грегор! Опубликуя что-то, что я бросил вместе ниже ... – dailymorn

ответ

2

На основе предложений Konrad, я отправляю другое решение, как она развивается. :)

AddPercentColumns <- function(df, col) { 
    # Sorts data.frame and adds "Percent" and "Cumulative Percent" columns. 
    # 
    # Args: 
    # df: data frame 
    # col: unevaluated column symbol e.g. substitute(col) 
    # 
    # Returns: 
    # Data frame sorted by "col" with new "Percent" and "Cumulative Percent" columns. 

    df %>% 
     arrange_(bquote(desc(.(col)))) %>% 
     mutate_(Percent = bquote(.(col)/sum(.(col)) * 100)) %>% 
     mutate(Cumulative = cumsum(Percent)) 
} 

Определенно более чистый, более отлаживаемый и удобочитаемый.

+0

Это намного приятнее! – Gregor

+0

Удаленные мои предыдущие комментарии, это гораздо лучшее решение. Используется ли это 'plyr ::."?? – Gregor

+0

Я предполагаю, что нет. bquote() - из базы, а помощь bquote специально относится к.(). Кроме того, у меня есть plyr "загружается через пространство имен (и не прилагается)". – dailymorn

0

Я нахожу sprintf() немного легче читать, чем paste(). Функция ниже кажется, что было бы очень весело отлаживать, но она выполняет свою работу.

AddPercentColumn <- function(df, col) { 
    # Sorts data.frame and adds "Percent" and "Cumulative Percent" columns. 
    # 
    # Args: 
    # df: data frame 
    # col: column name string 
    # 
    # Returns: 
    # Data frame sorted by "col" with new "Percent" and "Cumulative Percent" columns. 

    df %>% 
     arrange_(sprintf("desc(%s)", col)) %>% 
     mutate_(Percent = sprintf("%s/sum(%s) * 100", col, col)) %>% 
     mutate_(Cumulative = "cumsum(Percent)") 
} 

Не супер чистый, хотя ...

+0

В последней строке нет необходимости использовать 'mutate_',' mutate' работает отлично. Кроме того, я бы действительно возражал против использования строк здесь в любом проекте, в котором я должен был сотрудничать. Это работает, но это ужасное злоупотребление системой типов. Используйте выражения и/или 'lazyeval' здесь. На самом деле, я думаю, что со стороны dplyr ошибка, что он даже принимает этот код. –

+1

Чтобы добавить к этому, первая часть выражения в нестрочной версии может выглядеть следующим образом: 'organiz_ (bquote (desc (. (Col))))' - предполагая, что мы предварительно захватили имя необоснованного столбца: ' col = substitute (col) '. Вторая часть трубопровода следует эквивалентности. –

+0

Спасибо, Конрад! Новое решение ... – dailymorn

Смежные вопросы