2017-08-31 26 views
0

使用aggregate,R將創建一個列表Z,該列表可以用a$Z$`1.2`的形式索引,其中第一個數字引用X中的對應元素,同樣對於Y.此外,如果X或Y有10個以上元素,表格更改爲a$Z$`01.02`(假設對於100多個元素爲001.002)。使用值而不是索引訪問聚合數據

而不必係數Z-與零填充索引值X和Y的中,我怎麼能與實際的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

您可以輕鬆地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 
+0

這真的很流暢直觀!太糟糕了R沒有這個選項(?),所以你必須在每次聚合時添加這些額外的代碼行,或者創建一個包裝函數。 – forthrin

+0

是的。我查看了幫助文件'聚合',並沒有看到任何有這種能力的論點。 – lmo

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是結果一系列複雜的轉換的話,可以恢復df這樣的:

df <- tidyr::unnest(a) 

此時上述任何都可以使用。

+0

有趣的替代方法,雖然語法有點簡潔,但需要雙括號和引號。 – forthrin

+0

添加了(2)和(3) –

+0

您可以使用單個括號,但是您將返回包含結果的單元素列表。 –

相關問題