使用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
答案 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
此时可以使用上述任何一种。