我是新手。我正在尝试创建一个将按某个类别汇总一个变量的唯一值总数的方法。例如每天访问商店的唯一身份访问者数量。
我无法使用ddply来完成此工作,这是我最初的计划。但是,我成功地使用了聚合。我的问题是我希望变量名保留其原始名称,而不是采用函数中使用的名称(将数据框中的列名称返回为day和visitor_id而不是a和b)。
我在函数中有a和b,因为那是我弄清楚如何使它寻找变量而不是对象的唯一方法。
data <- data.frame(day = rep(c("Mon", "Tues", "Wed", "Thurs", "Fri"), time=5),
visitor_id = c(111,222,333,222,111,222,333,222,222,222,222,111,222,222,333,111,111,222,222,111,222,333,333,333,333))
total_unique <- function(var) {
x <- length(unique(var))
return(x)
}
my_function <- function(data, ag_category, var) {
a <- eval(substitute(ag_category), data)
b <- eval(substitute(var), data)
x <- aggregate(b~a, data, FUN=total_unique)
return(x)
}
test <- my_function(data=data, ag_category=day, var=visitor_id)
此外,如果任何人都可以指出我在ddply代码上做错了什么,那也将非常有帮助!
my_function2 <- function(data, ag_category, var) {
require(plyr)
a <- eval(substitute(ag_category), data)
b <- eval(substitute(var), data)
x <- ddply(data,~a,summarise, length(unique(b)))
return(x)
}
test2 <- my_function2(data=data, ag_category=day, var=visitor_id)
答案 0 :(得分:0)
这是一个解决方案:
library(tidyverse)
myFun <- function(data, ag_category, var){
varname <- quo({{var}})
data %>%
group_by({{ag_category}}) %>%
summarise(!!varname := length(unique({{var}})))
}
myFun(data=data, ag_category=day, var=visitor_id)
#> # A tibble: 5 x 2
#> day visitor_id
#> <fct> <int>
#> 1 Fri 3
#> 2 Mon 2
#> 3 Thurs 2
#> 4 Tues 3
#> 5 Wed 2
我们使用rlang
中的tidyverse
而不是将变量另存为新变量,以通过函数调用传递变量名。我们将分组变量分组,然后汇总唯一的观测值。
答案 1 :(得分:0)
如果您真的想将名称作为符号传递,则需要格外小心以构造所需的公式。这是一种方法
my_function <- function(data, ag_category, var) {
ff <- do.call("~", list(substitute(var), substitute(ag_category)))
x <- aggregate(ff, data, FUN=total_unique)
return(x)
}
my_function(data=data, ag_category=day, var=visitor_id)
如果您以字符串而不是符号的形式输入名称,将会更加容易
my_function_str <- function(data, ag_category, var) {
x <- aggregate(reformulate(ag_category, var), data, FUN=total_unique)
return(x)
}
my_function_str(data=data, ag_category="day", var="visitor_id")