2017-04-26 87 views
2

在'r dplyr方法考慮這個dplyr處理到數據幀:自己的功能

existing.df <- filter(existing.df, justanEx > 0) %>% 
       arrange(desc(justanEx)) %>% 
       mutate(mean = mean(justanEx), 
       median = median(justanEx), 
       rank = seq_len(length(anotherVar))) 

我必須這樣做了很多工作的我做,所以我嘗試做一個功能它:

df.overZ <- function(data, var){ 
     df <- data %>% filter(var > 0) %>% 
       arrange_(desc((var))) %>% 
       mutate(mean = mean(var), 
       median = median(var), 
       rank = seq_len(length(anotherVar))) 
     df 
} 

和他們

existing.df <- df.overZ(existing.df, "realVar") 

,但是這給了我這個錯誤:

Error in arrange_impl(.data, dots) : 
    incorrect size (1), expecting : 50000 

如果我嘗試:

existing.df <- df.overZ(existing.df, realVar) 

我得到這個錯誤:

Error in filter_impl(.data, dots) : obj 'realVar' not found 

我已經嘗試filter_,arrange_和mutate_,

但沒有SENS工作。

可以工作嗎?

如下功能的工作原理,但:

make.df <- function(var, n){ 
     df <- orign.df %>% filter(!is.na(var)) %>% 
       select(1:2,n,3:6) 
     df 
} 

existing.df <- make.df("oneVar",7) 
+0

什麼是錯誤消息?另外,請提供一些示例數據(data.df'的內容)。 – neilfws

+0

請使用'dput'顯示一個簡單的示例數據,並根據該數據預期輸出 – akrun

+0

[This could help](http://dplyr.tidyverse.org/articles/programming.html) – alistaire

回答

2

隨着dplyr的開發人員版本(即將推出0.6.0),我們可以利用的quosures

library(dplyr) 
df.overZ <- function(data, Var){ 
      Var <- enquo(Var) 
     data %>% 
       filter(UQ(Var) > 0) %>% 
       arrange(desc(UQ(Var))) %>% 
       mutate(Mean = mean(UQ(Var)), 
         Median = median(UQ(Var)), 
         rank = row_number()) 

} 

df.overZ(iris, Sepal.Length) 

我們可以擴展功能有一個group_by選項以及

df.overZ2 <- function(data, Var, grpVar){ 
      Var <- enquo(Var) 
      grpVar <- enquo(grpVar) 
      newVar <- paste(quo_name(Var), c("Mean", "Median", "Rank"), sep="_") 
     data %>% 
       filter(UQ(Var) > 0) %>% 
       arrange(desc(UQ(Var))) %>% 
       group_by(UQ(grpVar)) %>% 
       summarise(UQ(newVar[1]) := mean(UQ(Var)), 
         UQ(newVar[2]) := median(UQ(Var)), 
         UQ(newVar[3]) := n()) 

} 

df.overZ2(iris, Sepal.Length, Species) 
# A tibble: 3 × 4 
# Species Sepal.Length_Mean Sepal.Length_Median Sepal.Length_Rank 
#  <fctr>    <dbl>    <dbl>    <int> 
#1  setosa    5.006     5.0    50 
#2 versicolor    5.936     5.9    50 
#3 virginica    6.588     6.5    50 

這裏,enquo採取的輸入參數,並將其轉換爲quosure,那麼內部的功能(filter/arrange/mutate/summarise/group_by)我們解除引用(!!UQ),以評估它做了類似的工作爲substitutebase R。我們還可以通過在作業的右側傳遞quosure來命名列(:=

相關問題