我想使用下面的计算参数化dplyr,找出哪些值Sepal.Length与多个值相关联Sepal.Width:
library(dplyr)
iris %>%
group_by(Sepal.Length) %>%
summarise(n.uniq=n_distinct(Sepal.Width)) %>%
filter(n.uniq > 1)
Run Code Online (Sandbox Code Playgroud)
通常我会写这样的东西:
not.uniq.per.group <- function(data, group.var, uniq.var) {
iris %>%
group_by(group.var) %>%
summarise(n.uniq=n_distinct(uniq.var)) %>%
filter(n.uniq > 1)
}
Run Code Online (Sandbox Code Playgroud)
但是,这种方法会因为dplyr使用非标准评估而引发错误.应该如何编写这个函数?
我想在一个内部引用一个未知的列名summarise.dplyr 0.3允许使用变量引用列名称中引入的标准评估函数,但是当您base在例如a中调用R函数时,这似乎不起作用summarise.
library(dplyr)
key <- "v3"
val <- "v2"
drp <- "v1"
df <- data_frame(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))
Run Code Online (Sandbox Code Playgroud)
df看起来像这样:
> df
Source: local data frame [5 x 3]
v1 v2 v3
1 1 6 A
2 2 7 A
3 3 8 A
4 4 9 B
5 5 10 B
Run Code Online (Sandbox Code Playgroud)
我想放弃v1,按v3分组,并为每个组加上v2:
df %>% select(-matches(drp)) %>% group_by_(key) %>% summarise_(sum(val, na.rm = TRUE))
Error in …Run Code Online (Sandbox Code Playgroud) 我想从带有动态过滤器的sql server中提取一些数据.我正在以下列方式使用伟大的R包dplyr:
#Create the filter
filter_criteria = ~ column1 %in% some_vector
#Connect to the database
connection <- src_mysql(dbname <- "mydbname",
user <- "myusername",
password <- "mypwd",
host <- "myhost")
#Get data
data <- connection %>%
tbl("mytable") %>% #Specify which table
filter_(.dots = filter_criteria) %>% #non standard evaluation filter
collect() #Pull data
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常但现在我想以某种方式在我的表的所有列上循环它,因此我想将过滤器编写为:
#Dynamic filter
i <- 2 #With a loop on this i for instance
which_column <- paste0("column",i)
filter_criteria <- ~ which_column %in% some_vector
Run Code Online (Sandbox Code Playgroud)
然后使用更新的过滤器重新应用第一个代码.
不幸的是,这种方法没有给出预期的结果.实际上它没有给出任何错误,但是甚至没有将任何结果拉入R.特别是,我看了两个代码生成的SQL查询,并且有一个重要的区别.
第一个工作代码生成表单的查询:
SELECT ... FROM …Run Code Online (Sandbox Code Playgroud) 在基数R中,可以轻松过滤到两列等于的行,如下所示:
mtcars[mtcars$cyl==mtcars$carb,]
Run Code Online (Sandbox Code Playgroud)
使用dplyr的filter这种可以轻松完成
mtcars %>% filter(cyl==carb)
Run Code Online (Sandbox Code Playgroud)
但是,如果我正在使用此代码编写函数,我想使用filter_,但此代码不起作用
mtcars %>% filter_("cyl"=="carb")
Run Code Online (Sandbox Code Playgroud)
因为在这种情况下,它认为"碳水化合物"是要测试的值而不是变量.
我的问题是你如何filter_用来比较data.frame中的两个变量?
我已经看过几篇关于如何用dplyr函数编写自己的函数的帖子.例如,您可以在此帖子中看到如何使用group_by (regroup)和.我认为看看我是否可以使用主要功能编写函数会很有趣.我希望我们可以进一步了解如何使用函数编写函数.summarisedplyrdplyr
数据
country <- rep(c("UK", "France"), each = 5)
id <- rep(letters[1:5], times = 2)
value <- runif(10, 50, 100)
foo <- data.frame(country, id, value, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
目标
我想在函数中编写以下过程.
foo %>%
mutate(new = ifelse(value > 60, 1, 0)) %>%
filter(id %in% c("a", "b", "d")) %>%
group_by(country) %>%
summarize(whatever = sum(value))
Run Code Online (Sandbox Code Playgroud)
尝试
### Here is a function which does the same process
myFun <- function(x, ana, bob, cathy) x %>% …Run Code Online (Sandbox Code Playgroud)