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
Adata.table
解决方案-提高时间和内存效率
library(data.table)
DT <- as.data.table(DF)
DT[, list(calc = diff(b) / sum(c)), by = a]
库(data.table)
DTAdata.表
解决方案-时间和内存效率
library(data.table)
DT <- as.data.table(DF)
DT[, list(calc = diff(b) / sum(c)), by = a]
库(data.table)
DT