Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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关于聚合函数的帮助_R_Dataframe_Aggregate Functions_Aggregate - Fatal编程技术网

R关于聚合函数的帮助

R关于聚合函数的帮助,r,dataframe,aggregate-functions,aggregate,R,Dataframe,Aggregate Functions,Aggregate,对于我的问题,我创建了一个虚拟数据框: set.seed(007) DF <- data.frame(a = rep(LETTERS[1:5], each=2), b = sample(40:49), c = sample(1:10)) DF a b c 1 A 49 2 2 A 43 3 3 B 40 7 4 B 47 1 5 C 41 9 6 C 48 8 7 D 45 6 8 D 42 5 9 E 46 10 10 E 44

对于我的问题,我创建了一个虚拟数据框:

    set.seed(007)
 DF <- data.frame(a = rep(LETTERS[1:5], each=2), b = sample(40:49), c = sample(1:10))
 DF
   a  b  c
1  A 49  2
2  A 43  3
3  B 40  7
4  B 47  1
5  C 41  9
6  C 48  8
7  D 45  6
8  D 42  5
9  E 46 10
10 E 44  4
我的问题是,我不知道如何访问4个不同的单元格49、43、2和3
我尝试了
x[[1]][1]
和类似的东西,但没有成功。

aggregate
中,函数
FUN
独立应用于数据的每一列。在这里,您希望使用一个以两列作为输入的函数,因此事先不能使用
aggregate

相反,您可以使用
plyr
软件包中的
ddply

ddply(DF, "a", summarize, res = (b[1] - b[2]) / sum(c))
#   a        res
# 1 A  1.2000000
# 2 B -0.8750000
# 3 C -0.4117647
# 4 D  0.2727273
# 5 E  0.1428571

aggregate
中,函数
FUN
独立应用于数据的每一列。在这里,您希望使用一个以两列作为输入的函数,因此事先不能使用
aggregate

相反,您可以使用
plyr
软件包中的
ddply

ddply(DF, "a", summarize, res = (b[1] - b[2]) / sum(c))
#   a        res
# 1 A  1.2000000
# 2 B -0.8750000
# 3 C -0.4117647
# 4 D  0.2727273
# 5 E  0.1428571
您可以使用基本功能:

listOfRows <- 
by(data=DF,
   INDICES=DF$a,
   FUN=function(x){data.frame(a=x$a[1],res=(x$b[1] - x$b[2])/(x$c[1] + x$c[2]))})

newDF <- do.call(rbind,listOfRows)
listOfRows您可以使用基本函数:

listOfRows <- 
by(data=DF,
   INDICES=DF$a,
   FUN=function(x){data.frame(a=x$a[1],res=(x$b[1] - x$b[2])/(x$c[1] + x$c[2]))})

newDF <- do.call(rbind,listOfRows)

listOfRows当您聚合
FUN
参数时,它可以是您想要的任何内容。请记住,传递的值要么是一个
向量
(如果x是一列),要么是一个小
数据帧
矩阵
(如果x不止一列)。但是,
aggregate
不允许您访问多列参数的列。比如说

aggregate( . ~ a, data = DF, FUN = function(x) diff(x[,1]) / sum(x[,2]) )
即使我使用了
(它获取了我在其他地方没有使用的DF的所有列),它也会失败并出现错误。要查看聚合
试图在那里做什么,请查看以下内容

aggregate( . ~ a, data = DF, FUN = sum )
这两列b和c是聚合的,但从第一次尝试开始,我们就知道不能单独访问每一列。因此,严格遵守聚合,您需要两个过程和三行代码

diffb <- aggregate( b ~ a, data = DF, FUN = diff )
Y <- aggregate( c ~ a, data = DF, FUN = sum )
Y$c <- diffb$b / Y$c
如果您真的需要,您需要做一些工作才能将结果返回到
data.frame

data.frame(a = names(l), x = unlist(l))

当您聚合
时,FUN
参数可以是您想要的任何内容。请记住,传递的值要么是一个
向量
(如果x是一列),要么是一个小
数据帧
矩阵
(如果x不止一列)。但是,
aggregate
不允许您访问多列参数的列。比如说

aggregate( . ~ a, data = DF, FUN = function(x) diff(x[,1]) / sum(x[,2]) )
即使我使用了
(它获取了我在其他地方没有使用的DF的所有列),它也会失败并出现错误。要查看聚合
试图在那里做什么,请查看以下内容

aggregate( . ~ a, data = DF, FUN = sum )
这两列b和c是聚合的,但从第一次尝试开始,我们就知道不能单独访问每一列。因此,严格遵守聚合,您需要两个过程和三行代码

diffb <- aggregate( b ~ a, data = DF, FUN = diff )
Y <- aggregate( c ~ a, data = DF, FUN = sum )
Y$c <- diffb$b / Y$c
如果您真的需要,您需要做一些工作才能将结果返回到
data.frame

data.frame(a = names(l), x = unlist(l))

使用
数据表可以更快更简单

library(data.table)
DT <- data.table(DF)
DT[, (-1*diff(b))/sum(c), by=a]
  a         V1
1: A  1.2000000
2: B -0.8750000
3: C -0.4117647
4: D  0.2727273
5: E  0.1428571

使用
数据表可以更快更简单

library(data.table)
DT <- data.table(DF)
DT[, (-1*diff(b))/sum(c), by=a]
  a         V1
1: A  1.2000000
2: B -0.8750000
3: C -0.4117647
4: D  0.2727273
5: E  0.1428571

A
data.table
解决方案-提高时间和内存效率

library(data.table)
DT <- as.data.table(DF)

DT[, list(calc = diff(b) / sum(c)), by = a]
库(data.table)

DTA
data.表
解决方案-时间和内存效率

library(data.table)
DT <- as.data.table(DF)

DT[, list(calc = diff(b) / sum(c)), by = a]
库(data.table)
DT