自己的功能
问题描述:
在'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)
答
随着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
),以评估它做了类似的工作为substitute
从base R
。我们还可以通过在作业的右侧传递quosure
来命名列(:=
)
什么是错误消息?另外,请提供一些示例数据(data.df'的内容)。 – neilfws
请使用'dput'显示一个简单的示例数据,并根据该数据预期输出 – akrun
[This could help](http://dplyr.tidyverse.org/articles/programming.html) – alistaire