Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用ddply以编程方式汇总多个列?_R_Parsing_Eval_Plyr - Fatal编程技术网

R 如何使用ddply以编程方式汇总多个列?

R 如何使用ddply以编程方式汇总多个列?,r,parsing,eval,plyr,R,Parsing,Eval,Plyr,是否可以在不使用eval+parse的情况下,从函数的参数中指定要使用ddply聚合的列?以下是我到目前为止的情况: x <- c(2,4,3,1,5,7) y <- c(3,2,6,3,4,6) group1 <- c("A","A","A","A","B","B") group2 <- c("X","X","Y","Y","Z","X") data <- data.frame(group1, group2, x, y) x您可以考虑 dPLYR 包-通常它

是否可以在不使用eval+parse的情况下,从函数的参数中指定要使用ddply聚合的列?以下是我到目前为止的情况:

x <- c(2,4,3,1,5,7)
y <- c(3,2,6,3,4,6)
group1 <- c("A","A","A","A","B","B")
group2 <- c("X","X","Y","Y","Z","X")

data <- data.frame(group1, group2, x, y)

<代码> x您可以考虑<代码> dPLYR 包-通常它比<代码> PLYR 快得多,也有漂亮的语法。

library(dplyr)

x <- c(2,4,3,1,5,7)
y <- c(3,2,6,3,4,6)
group1 <- c("A","A","A","A","B","B")
group2 <- c("X","X","Y","Y","Z","X")

aggFunction <- function(dataframe, toAverage, toGroup) {
  dataframe %>%
    group_by_(.dots = toGroup) %>%
    summarise_(.dots = setNames(sprintf("mean(%s)", toAverage), toAverage))
}

data <- data.frame(group1, group2, x, y)
aggFunction(data, c("x", "y"), c("group1", "group2"))

在基本R中使用
聚合

aggFunction <- function(dataframe, toAverage, toGroup) {
  aggregate(dataframe[, toAverage], dataframe[, toGroup], mean)
}

aggFunction(data, c("x", "y"), c("group1", "group2"))

   group1 group2 x   y
1      A      X 3 2.5
2      B      X 7 6.0
3      A      Y 2 4.5
4      B      Z 5 4.0

aggFunction如果您先融化数据帧,以长格式进行计算,然后进行回溯,那么这会容易得多

library(reshape2)
library(plyr)
aggFunction <- function(d1, toAverage, toGroup) {
    d2 <- melt(d1, id.vars=toGroup, measure.vars=toAverage)
    d3 <- ddply(d2, ~group1 + group2 + variable, summarize, mean=mean(value))
    dcast(d3, group1 + group2 ~ variable, value.var="mean")
}
aggFunction(data, c("x", "y"), c("group1", "group2"))
##   group1 group2 x   y
## 1      A      X 3 2.5
## 2      A      Y 2 4.5
## 3      B      X 7 6.0
## 4      B      Z 5 4.0
library(重塑2)
图书馆(plyr)
聚集函数
aggFunction <- function(dataframe, toAverage, toGroup) {

  string <- paste(toAverage, " = mean(", toAverage, ")", sep = "", collapse = ", ")
  print(string)

  args <- list(dataframe, toGroup, here(summarise), string)
  out <- do.call(ddply, args)

  return(out)
}
aggFunction(data, c("x", "y"), c("group1", "group2"))

# group1 group2 "x = mean(x), y = mean(y)"
# 1      A      X   x = mean(x), y = mean(y)
# 2      A      Y   x = mean(x), y = mean(y)
# 3      B      X   x = mean(x), y = mean(y)
# 4      B      Z   x = mean(x), y = mean(y)
aggFunction <- function(dataframe, toAverage, toGroup) {

  testVar <- "x"

  out <- ddply(dataframe, toGroup, here(summarise), 
           get(testVar) = mean(get(testVar))
           ## 
  return(out)
}
library(dplyr)

x <- c(2,4,3,1,5,7)
y <- c(3,2,6,3,4,6)
group1 <- c("A","A","A","A","B","B")
group2 <- c("X","X","Y","Y","Z","X")

aggFunction <- function(dataframe, toAverage, toGroup) {
  dataframe %>%
    group_by_(.dots = toGroup) %>%
    summarise_(.dots = setNames(sprintf("mean(%s)", toAverage), toAverage))
}

data <- data.frame(group1, group2, x, y)
aggFunction(data, c("x", "y"), c("group1", "group2"))
  group1 group2 x   y
1      A      X 3 2.5
2      A      Y 2 4.5
3      B      X 7 6.0
4      B      Z 5 4.0
aggFunction <- function(dataframe, toAverage, toGroup) {
  aggregate(dataframe[, toAverage], dataframe[, toGroup], mean)
}

aggFunction(data, c("x", "y"), c("group1", "group2"))

   group1 group2 x   y
1      A      X 3 2.5
2      B      X 7 6.0
3      A      Y 2 4.5
4      B      Z 5 4.0
library(reshape2)
library(plyr)
aggFunction <- function(d1, toAverage, toGroup) {
    d2 <- melt(d1, id.vars=toGroup, measure.vars=toAverage)
    d3 <- ddply(d2, ~group1 + group2 + variable, summarize, mean=mean(value))
    dcast(d3, group1 + group2 ~ variable, value.var="mean")
}
aggFunction(data, c("x", "y"), c("group1", "group2"))
##   group1 group2 x   y
## 1      A      X 3 2.5
## 2      A      Y 2 4.5
## 3      B      X 7 6.0
## 4      B      Z 5 4.0