微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用R进行多个单独组的相同字段聚合

我试图分别对几个(实际上是数百个)组执行指标计数(不是所有组的所有组合).我将通过简化的例子来演示它:

假设我有那个数据集

data<-cbind(c(1,1,2,2),c(1,3),c(3,3))
> data

      [,1] [,2] [,3]
[1,]    1    1    3
[2,]    1    1    2
[3,]    1    2    1
[4,]    2    2    2
[5,]    2    2    2
[6,]    2    3    3

一个指标

some_indicator<-c(1,1)

然后我想运行没有循环(如列应用),如,

aggregate(some_indicator,list(data[,1]),sum)
aggregate(some_indicator,2]),3]),sum)

这将产生以下结果:

[,]    1    1    0
[2,]    2    1    1
[3,]    0    1    2

即对于每一列(值子集在列之间没有太大变化),按值计算指标并合并它.

目前我用循环列编写它,但我需要更有效的方法,因为有很多列,它需要一个多小时.

提前致谢,
迈克尔.

1)tapply tapply的第一个参数是每个列都被some_indicator替换的数据.第二个参数表示我们希望按数据组和列号分组.
result <- tapply(replace(data,TRUE,some_indicator),list(data,col(data)),sum)
replace(unname(result),is.na(result),0)

对于问题中显示的输入,最后一行给出:

[,]    0    1    2

1a)tapply一个稍长的tapply解决方案将是以下. fun将列作为其参数,并使用tapply将some_indicator中的组作为组使用该列进行求和;但是,不同的列可以在其中具有不同的组,以确保它们都具有相同的组(为了以后的对齐),我们实际上按因子(x,levs)分组. sapply为每列数据应用了乐趣. as.data.frame是必需的,因为数据是一个矩阵,所以如果我们要将它应用于每个元素而不是每个列,则应用sapply.

levs <- levels(factor(data))
 fun <- function(x) tapply(some_indicator,factor(x,levs),sum)
 result <- sapply(as.data.frame(data),fun)
 replace(unname(result),0)

2)xtabs这与tapply解决方案非常相似.它具有以下优点:(1)总和由xtabs暗示,因此无需指定,并且(2)未填充的单元格用0而不是NA填充,从而消除了用0替换NA的额外步骤.另一方面我们必须使用c将公式的每个分量解析为向量,因为与tapply不同,xtabs公式将不接受矩阵:

result <- xtabs(c(replace(data,some_indicator)) ~ c(data) + c(col(data)))
dimnames(result) <- NULL

对于问题中的数据,这给出了:

> result
     [,]    0    1    2

修订后的tapply解决方案和添加的xtabs解决方案.

原文地址:https://www.jb51.cc/javaschema/281725.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐