【问题标题】:Multiple aggregation in R with 4 parametersR中具有4个参数的多重聚合
【发布时间】:2014-06-15 03:17:22
【问题描述】:

我有四个向量(列)

 x y z  t
 1 1 1 10
 1 1 1 15
 2 4 1 14
 2 3 1 15
 2 2 1 17
 2 1 2 19
 1 4 2 18
 1 4 2 NA
 2 2 2 45
 3 3 2 NA
 3 1 3 59
 4 3 3 23
 1 4 3 45
 4 4 4 74
 2 1 4 86

对于向量 y 的每个值(从 1 到 4),其中 x=1,z=1,如何使用 R 中的聚合函数计算向量 t 的平均值和中位数?

讨论了如何使用 3 个参数 (Multiple Aggregation in R),但有点不清楚如何使用 4 个参数。

谢谢。

【问题讨论】:

  • 尝试使用聚合的最大问题是您需要不同的聚合函数(均值和中值)。 aggregate() 一次只使用一个。
  • @MrFlick: 不是真的 - aggregate(t~y, data=subset(d, x==1 & z==1), function(x) c(mean=mean(x), median=median(x)))
  • @jbaums - 当然,这样做的缺点是您最终会在数据框中得到一个矩阵,其中包含列meanmedian。结构最终有点扭曲。没有什么do.call(data.frame,output)解决不了的,但还是有点麻烦。

标签: r aggregate


【解决方案1】:

你可以在data.table中尝试这样的事情

data <- data.table(yourdataframe)

bar <- data[,.N,by=y]
foo <- data[x==1 & z==1,list(mean.t=mean(t,na.rm=T),median.t=median(t,na.rm=T)),by=y]
merge(bar[,list(y)],foo,by="y",all.x=T)

   y mean.t median.t
1: 1   12.5     12.5
2: 2     NA       NA
3: 3     NA       NA
4: 4     NA       NA

您可能可以在aggregate 中做同样的事情,但我不确定您是否可以通过一个简单的步骤做到这一点。

对 cme​​ts 中附加请求的回答...

bar <- data.table(expand.grid(y=unique(data$y),z=unique(data[z %in% c(1,2,3,4),z])))
foo <- data[x==1 & z %in% c(1,2,3,4),list(
  mean.t=mean(t,na.rm=T),
  median.t=median(t,na.rm=T),
  Q25.t=quantile(t,0.25,na.rm=T),
  Q75.t=quantile(t,0.75,na.rm=T)
  ),by=list(y,z)]
merge(bar[,list(y,z)],foo,by=c("y","z"),all.x=T)

    y z mean.t median.t Q25.t Q75.t
 1: 1 1   12.5     12.5 11.25 13.75
 2: 1 2     NA       NA    NA    NA
 3: 1 3     NA       NA    NA    NA
 4: 1 4     NA       NA    NA    NA
 5: 2 1     NA       NA    NA    NA
 6: 2 2     NA       NA    NA    NA
 7: 2 3     NA       NA    NA    NA
 8: 2 4     NA       NA    NA    NA
 9: 3 1     NA       NA    NA    NA
10: 3 2     NA       NA    NA    NA
11: 3 3     NA       NA    NA    NA
12: 3 4     NA       NA    NA    NA
13: 4 1     NA       NA    NA    NA
14: 4 2   18.0     18.0 18.00 18.00
15: 4 3   45.0     45.0 45.00 45.00
16: 4 4     NA       NA    NA    NA

【讨论】:

  • 谢谢,我尝试这样做但得到错误:未使用的参数(by = y)
  • 你先把它变成data.table对象了吗?
  • 当 x=1 且 z=1 时您想要……还是当 x=1 或 y=1 时您想要您想要吗?那可能就是区别。如果没有,您将不得不发布所需的输出,因为我不清楚。
  • 现在可以了,我想为 x=1 和 z=1 做。在这些条件下,y 只能等于 1,并且我在 y=1 的结果中得到一行,但是我怎样才能得到每个 y 的结果,例如如果 y=2,3,4 我需要在结果中得到 NA .
  • 是的..添加分位数或标准差很容易。往上看。请将此标记为已回答。
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 2015-09-25
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多