我对R比较陌生,并尝试使用ddply&从plyr包中总结出来。 This post几乎(但不完全)回答了我的问题。我可以使用一些额外的解释/澄清。
我的问题:
我想创建一个简单的函数来按组分析给定变量的描述性统计。与链接的帖子不同,我想将感兴趣的变量作为函数的参数包含在内。正如本网站已经讨论的那样,这有效:
require(plyr)
ddply(mtcars, ~ cyl, summarise,
mean = mean(hp),
sd = sd(hp),
min = min(hp),
max = max(hp)
)
但这不是:
descriptives_by_group <- function(dataset, group, x)
{
ddply(dataset, ~ group, summarise,
mean = mean(x),
sd = sd(x),
min = min(x),
max = max(x)
)
}
descriptives_by_group(mtcars, cyl, hp)
由于我正在使用的数据量,我希望能够有一个函数,允许我指定我感兴趣的变量以及数据集和分组变量。
我尝试编辑here找到的各种解决方案来解决我的问题,但我不能很好地理解代码,以便成功完成。
原始海报使用了以下示例数据集:
a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")
使用所需的输出:
b Ave
1 0 1.5
2 1 3.5
哈德利赞同的解决方案是:
myFunction <- function(x, y){
NewColName <- "a"
z <- ddply(x, y, .fun = function(xx,col){
c(Ave = mean(xx[,col],na.rm=TRUE))},
NewColName)
return(z)
}
myFunction(df, sv)
返回所需输出的位置。
我试图逐段分解代码,看看是否通过更好地理解底层机制,我可以修改代码以包含一个参数,该函数将传递给什么,在本例中,是“NewColName”(您想要获取有关信息的变量)。但我没有任何成功。我的困难在于我不明白(xx[,col])
发生了什么。我知道mean(xx [,col])应该采用数据框col
的索引为xx
的列的平均值。但我不明白匿名函数从哪里读取这些值。
请有人帮我解析一下吗?我浪费了几个小时完成一项微不足道的任务,我可以通过非常重复的代码和/或子集来轻松完成,但是我试图让我的脚本更简单和优雅,并且理解这个问题的“为什么”,其解决方案。
PS我已经从psych包中查看了describeBy函数,但据我所知,它不允许你指定要为其返回值的变量,因此无法解决我的问题。
答案 0 :(得分:7)
我刚刚在你给出的示例函数中移动了几个东西,并展示了如何让多个列退出。这样做你想要的吗?
myFunction2 <- function(x, y, col){
z <- ddply(x, y, .fun = function(xx){
c(mean = mean(xx[,col],na.rm=TRUE),
max = max(xx[,col],na.rm=TRUE) ) })
return(z)
}
myFunction2(mtcars, "cyl", "hp")
答案 1 :(得分:5)
(更多的是评论而不是答案。在函数中使用ddply(...,summarise, ...)
时,我遇到了与您相同的难度。)这是一个按我预期的方式工作的基本解决方案:
descriptives_by_group <- function(dataset, group, x)
{aggregate(dataset[[x]], dataset[group], function(x)
c( mean = mean(x),
sd = sd(x),
min = min(x),
max = max(x)
) )
}
descriptives_by_group(mtcars, 'cyl', 'hp')
答案 2 :(得分:3)
只需使用as.quoted
功能即可。以下示例
simple_ddply <- function(dataset_name, variable_name){
data <- ddply(dataset_name,as.quoted(variable_name), *remaining input)**
答案 3 :(得分:0)
在quosures
的devel版本中引入dplyr
(即将发布0.6.0
),这会变得更容易
library(dplyr)
descriptives_by_groupN <- function(dataset, group, x) {
group <- enquo(group)
x <- enquo(x)
dataset %>%
group_by(!!group) %>%
summarise(Mean = mean(!!x),
SD = sd(!!x),
Min = min(!!x),
Max = max(!!x))
}
descriptives_by_groupN(mtcars, cyl, hp)
# A tibble: 3 × 5
# cyl Mean SD Min Max
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 82.63636 20.93453 52 113
#2 6 122.28571 24.26049 105 175
#3 8 209.21429 50.97689 150 335
此处,输入参数将转换为quosures
enquo
,并在group_by/summarise
内,取消引用quosures(!!
或UQ
)以获取它进行了评估