gpt4 book ai didi

r - 在聚合中使用变异系数

转载 作者:可可西里 更新时间:2023-11-01 11:21:10 25 4
gpt4 key购买 nike

我有一个包含 50000 行和 200 列的数据框。数据中有重复行,我想通过使用 R 中的聚合函数在重复项中选择具有最大变异系数的行来聚合数据。对于聚合,我可以默认使用“均值”、“总和”,但不能使用系数变异.

例如

aggregate(data, as.columnname, FUN=mean)

工作正常。

我有一个用于计算变异系数的自定义函数,但不确定如何将其与聚合一起使用。

co.var <- function(x)
(
100*sd(x)/mean(x)
)

我试过了

aggregate(data, as.columnname, function (x) max (co.var (x, data[index (x),])

但由于未找到对象 x 而给出错误。

最佳答案

假设我理解您的问题,我会建议使用 tapply() 而不是 aggregate()(有关详细信息,请参阅 ?tapply ).但是,一个最小的工作示例将非常有帮助。

co.var <- function(x) ( 100*sd(x)/mean(x) )

## Data with multiple repeated measurements.
## There are three things (ID 1, 2, 3) that
## are measured two times, twice each (val1 and val2)
myDF<-data.frame(ID=c(1,2,3,1,2,3),val1=c(20,10,5,25,7,2),
val2=c(19,9,4,24,4,1))

## Calculate coefficient of variation for each measurement set
myDF$coVar<-apply(myDF[,c("val1","val2")],1,co.var)

## Use tapply() instead of aggregate
mySel<-tapply(seq_len(nrow(myDF)),myDF$ID,function(x){
curSub<-myDF[x,]
return(x[which(curSub$coVar==max(curSub$coVar))])
})

## The mySel vector is then the vector of rows that correspond to the
## maximum coefficient of variation for each ID
myDF[mySel,]

编辑:

有更快的方法,下面是其中一种。但是,对于 40000 x 100 的数据集,上述代码在我的机器上只用了 16 到 20 秒。

# Create a big dataset

myDF <- data.frame(val1 = c(20, 10, 5, 25, 7, 2),
val2 = c(19, 9, 4, 24, 4, 1))
myDF <- myDF[sample(seq_len(nrow(myDF)), 40000, replace = TRUE), ]
myDF <- cbind(myDF, rep(myDF, 49))
myDF$ID <- sample.int(nrow(myDF)/5, nrow(myDF), replace = TRUE)

# Define a new function to work (slightly) better with large datasets

co.var.df <- function(x) ( 100*apply(x,1,sd)/rowMeans(x) )

# Create two datasets to benchmark the two methods
# (A second method proved slower than the third, hence the naming)

myDF.firstMethod <- myDF
myDF.thirdMethod <- myDF

计时原法

startTime <- Sys.time()
myDF.firstMethod$coVar <- apply(myDF.firstMethod[,
grep("val", names(myDF.firstMethod))], 1, co.var)
mySel <- tapply(seq_len(nrow(myDF.firstMethod)),
myDF.firstMethod$ID, function(x) {
curSub <- myDF.firstMethod[x, ]
return(x[which(curSub$coVar == max(curSub$coVar))])
}, simplify = FALSE)
endTime <- Sys.time()

R> endTime-startTime
Time difference of 17.87806 secs

时间秒法

startTime3 <- Sys.time()
coVar3<-co.var.df(myDF.thirdMethod[,
grep("val",names(myDF.thirdMethod))])
mySel3 <- tapply(seq_along(coVar3),
myDF[, "ID"], function(x) {
return(x[which(coVar3[x] == max(coVar3[x]))])
}, simplify = FALSE)
endTime3 <- Sys.time()

R> endTime3-startTime3
Time difference of 2.024207 secs

检查我们是否得到相同的结果:

R> all.equal(mySel,mySel3)
[1] TRUE

原始帖子有一个额外的变化,编辑后的代码认为对于给定的 ID,可能有不止一行具有最高的 CV。因此,要从编辑的代码中获取结果,您必须unlist mySelmySel3 对象:

myDF.firstMethod[unlist(mySel),]

myDF.thirdMethod[unlist(mySel3),]

关于r - 在聚合中使用变异系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9800088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com