2017-07-19 80 views
4

我有一個data.frame列的因素,我想計算最大(或最小或分位數)。我不能在這些因素上使用這些功能,但我想。最大和因子聚合

下面是一些例子:

set.seed(3) 
df1 <- data.frame(id = rep(1:5,each=2),height=sample(c("low","medium","high"),size = 10,replace=TRUE)) 
df1$height <- factor(df1$height,c("low","medium","high")) 
df1$height_num <- as.numeric(df1$height) 
# > df1 
# id height height_num 
# 1 1 low   1 
# 2 1 high   3 
# 3 2 medium   2 
# 4 2 low   1 
# 5 3 medium   2 
# 6 3 medium   2 
# 7 4 low   1 
# 8 4 low   1 
# 9 5 medium   2 
# 10 5 medium   2 

我可以很容易地做到這一點:

aggregate(height_num ~ id,df1,max) 
# id height_num 
# 1 1   3 
# 2 2   2 
# 3 3   2 
# 4 4   1 
# 5 5   2 

但不是這樣的:

aggregate(height ~ id,df1,max) 
# Error in Summary.factor(c(2L, 2L), na.rm = FALSE) : 
# ‘max’ not meaningful for factors 

我要帶最大的 「高度」,並保留在我的彙總表中與原始表中相同的級別。在我的真實數據中,我有很多列,我想保留我的因素排序,以保持我的情節清晰和一致。

我能做到這樣,而在其他聚合函數使用下面的結構,以及:

use_factors <- function(x,FUN){factor(levels(x)[FUN(as.numeric(x))],levels(x))} 
aggregate(height ~ id,df1,use_factors,max) 
# id height 
# 1 1 high 
# 2 2 medium 
# 3 3 medium 
# 4 4 low 
# 5 5 medium 

或者我可以超載maxminmedianquantile功能我想 但我覺得我肯定會重新發明輪子。

有沒有簡單的方法來做到這一點?

回答

4

實際上,如果您使用的是有序因子,您可以做你想要的聚合。

set.seed(3) 
df1 <- data.frame(id = rep(1:5,each=2),height=sample(c("low","medium","high"),size = 10,replace=TRUE)) 
df1$height <- factor(df1$height,c("low","medium","high"), ordered = TRUE) 
df1$height_num <- as.numeric(df1$height) 

aggregate(height~id, df1, max) 
    id height 
1 1 high 
2 2 medium 
3 3 medium 
4 4 low 
5 5 medium 
+0

非常感謝,我知道它一定很容易!這是錯誤的說錯誤說'最大'對因素沒有意義' –

+0

是的。該消息可能會更有幫助。 – G5W