2017-08-03 158 views
0

我正在考慮基於dplyr包創建函數。我見過幾個例子,比如Janitor包和Organism.dplyr。但是,我不知道我可以擴展或固有dplyr功能,或者即使可能。創建一個基於dplyr的函數

例如,我想:

數據%>%GROUP_BY(columnX)%>%my_mutate_like_function()

但是,它不工作,我看到了一個關於它的使用後DO()作爲替代... 但是,這不是我想要的。

任何人都可以幫助我嗎?謝謝。

==遵循代碼示例(編輯)==

data <- data.frame(groupname = c('A', 'B', 'A', 'A', 'B', 'B'), 
        value = c(1, 3, 4, 2, 1.4, 5)) 

my_mutate_like_function <- function(data) { 
    data$category <- ifelse(data$value <= mean(data$value), 'In', 'Out') 
    data$meanvalue <- mean(data$value) 
    data 
} 

data_works <- data %>% group_by(groupname) %>% 
    mutate(category = ifelse(value <= mean(value), 'In', 'Out'), meanvalue = mean(value)) 
# That's the right output, each "groupname" had their average calculated and it was used a threshold value 

data_fails <- data %>% group_by(groupname) %>% 
    my_mutate_like_function() 
# The group_by properties seems not work inside my function 
+2

你能證明不隨數據樣本和預期輸出工作的代碼? – eipi10

+0

我添加了一個代碼示例。 – andrefonseca

+0

對不起,如果這是一個愚蠢的評論,但只是在你的函數內使用dplyr,即包裝?或者你想在你的函數中使用「baseR方法」? – friep

回答

0

根據這個問題dplyr::mutate to add multiple values沒有優雅的方式來獲得dplyr在一個函數的兩個返回值。爲了使用group_by,我只是設法讓它工作,如果我將這個函數包裝在mutate()中,這是有道理的,因爲在將值傳遞給你的新函數之前,mutate會正確地處理分組。我添加了一個使其可見的。

print(mean(value)) 

所以可能的解決辦法是:

my_mutate_like_function1 <- function(value) { 

    ifelse(value <= mean(value), 'In', 'Out') 
} 


my_mutate_like_function2 <- function(value) { 
    print(mean(value)) 
    mean(value) 
} 


data %>% group_by(groupname) %>% 
    mutate(category=my_mutate_like_function1(value),meanvalue=my_mutate_like_function2(value))