首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于R中唯一三位一体的数据聚合

基于R中唯一三位一体的数据聚合
EN

Stack Overflow用户
提问于 2014-07-24 05:51:24
回答 3查看 107关注 0票数 1

我是在这里被Counting existing permutations in R推荐来问以前的相关问题的,但是我不能把它应用到我的问题上。这是我有的数据

代码语言:javascript
复制
One <- c(rep("X",6),rep("Y",3),rep("Z",2))
Two <- c(rep("A",4),rep("B",6),rep("C",1))
Three <- c(rep("J",5),rep("K",2),rep("L",4))
Number <- runif(11)


df <- data.frame(One,Two,Three,Number)


   One Two Three     Number
1    X   A     J 0.10511669
2    X   A     J 0.62467760
3    X   A     J 0.24232663
4    X   A     J 0.38358854
5    X   B     J 0.04658226
6    X   B     K 0.26789844
7    Y   B     K 0.07685341
8    Y   B     L 0.21372276
9    Y   B     L 0.13620971
10   Z   B     L 0.49073692
11   Z   C     L 0.52968279

我试过了

代码语言:javascript
复制
aggregate(df, df[,c(1:3)],FUN = c(length,mean))

已收到

代码语言:javascript
复制
Error in match.fun(FUN) : 
'c(length, mean)' is not a function, character or symbol

我试图通过创建一个新的数据框架来进行聚合,该框架为我提供了每个唯一三位一体(一、二、三)的频率,以及另一列,其中包含了每个唯一三位一体的Number中值。所以对于(X,A,J)三位一体,我希望计数=4和中位数是Number下前四个数字的中位数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-24 06:06:33

你可以用dplyr

代码语言:javascript
复制
 library(dplyr)
 res <- df%>%
 group_by(One,Two,Three) %>%
 summarize(length=n(), Mean=mean(Number)) #change `mean` to `median` if you want `median`

 str(res)
#Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    7 obs. of  5 variables:
 ----------
  str(as.data.frame(res))
#'data.frame':  7 obs. of  5 variables:
# $ One   : Factor w/ 3 levels "X","Y","Z": 1 1 1 2 2 3 3
# $ Two   : Factor w/ 3 levels "A","B","C": 1 2 2 2 2 2 3
# $ Three : Factor w/ 3 levels "J","K","L": 1 1 2 2 3 3 3
# $ length: int  4 1 1 1 2 1 1
# $ Mean  : num  0.689 0.989 0.524 0.181 0.345 ...

代码语言:javascript
复制
library(data.table)
setDT(df)[,list(length=.N, Mean=mean(Number)),by=list(One,Two,Three)]
#      One Two Three length      Mean
# 1:   X   A     J      4 0.3660189
# 2:   X   B     J      1 0.8389641
# 3:   X   B     K      1 0.2815004
# 4:   Y   B     K      1 0.4990414
# 5:   Y   B     L      2 0.3814621
# 6:   Z   B     L      1 0.1144003
# 7:   Z   C     L      1 0.9508751
票数 3
EN

Stack Overflow用户

发布于 2014-07-24 06:07:22

代码语言:javascript
复制
OTT <- paste(One,Two,Three)
ott.mean <- tapply(Number,OTT,mean)
ott.count <- tapply(OTT,OTT,length)
cbind(ott.mean,ott.count)
票数 0
EN

Stack Overflow用户

发布于 2014-07-24 06:19:01

看起来很简单:

代码语言:javascript
复制
aggregate( df$Number, df[ , c(1:3)],
                    FUN = function(x) { c( len=length(x), mn=mean(x) ) } )

@latemail不知道你所说的“有缺陷的”data.frame是什么意思。第四个元素是矩阵。矩阵是数据的合法组成部分:

代码语言:javascript
复制
> d2[[4]]

     len        mn
[1,]   4 0.7531795
[2,]   1 0.8777003
[3,]   1 0.8003510
[4,]   1 0.6113566
[5,]   2 0.2470044
[6,]   1 0.3444656
[7,]   1 0.7517357

并且矩阵可以按通常的方式访问:

代码语言:javascript
复制
> d2[ , 'x'][ , "mn"]
[1] 0.7531795 0.8777003 0.8003510 0.6113566 0.2470044 0.3444656 0.7517357
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24926039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档