自己的功能

问题描述:

在'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

随着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来命名列(:=