使用值而不是索引访问聚合数据

时间:2017-08-31 13:02:17

标签: r aggregate

使用aggregate,R创建一个列表Z,可以在a$Z$`1.2`格式上编制索引,其中第一个数字引用X中的相应元素,同样适用于Y.此外,如果是X或Y有10个以上的元素,表单更改为a$Z$`01.02`(假设001.002为100多个元素。)

不必使用X和Y的零填充索引值来索引Z,而是如何使用实际的X和Y值进行索引(例如。a$Z$`52.60`),这似乎更直观!

df = data.frame(X=c(50, 52, 50), Y=c(60, 60, 60), Z=c(4, 5, 6))
a = aggregate(Z ~ X + Y, df, c)
str(a)

'data.frame':   2 obs. of  3 variables:
 $ X: num  50 52
 $ Y: num  60 60
 $ Z:List of 2
  ..$ 1.1: num  4 6
  ..$ 1.2: num 5

2 个答案:

答案 0 :(得分:2)

您可以在aggregate之后轻松完成此操作:

names(a$Z) <- paste(a$X, a$Y, sep=".")

然后检查出来

str(a)
'data.frame':   2 obs. of  3 variables:
 $ X: num  50 52
 $ Y: num  60 60
 $ Z:List of 2
  ..$ 50.60: num  4 6
  ..$ 52.60: num 5

答案 1 :(得分:0)

1)请尝试tapply

ta <- tapply(df[[3]], df[-3], c)

ta[["50", "60"]]
## [1] 4 6

ta[["52", "60"]]
## [1] 5

2)子集考虑一下根本不使用aggregate并使用subset来检索值:

subset(df, X == 50 & Y == 60)$Z
## [1] 4 6

3)data.table 使用data.table进行子集化更容易:

library(data.table)

dt <- data.table(df, key = "X,Y")
dt[.(50, 60), Z]

## [1] 4 6

注意:如果您实际上并未从问题中显示的df开始,而是a是一系列复杂转换的结果,那么我们可以恢复{ {1}}像这样:

df

此时可以使用上述任何一种。