2016-09-18 79 views
0

寫入時:df.stats <- aggregate(var1 ~ var2, data=df, FUN=mean)
df.stats保留列名(var1和var2)。
寫入時:df.stats <- aggregate(df[,1] ~ df[,2], data=df, FUN=mean)
df.stats列被稱爲df [,1]和df [,2] - 並且原始列名稱丟失。R:使用索引丟失列名

如何使用索引並仍保留原始列名稱? 我爲什麼要使用索引?因爲,我不想每次分析數據集中的新列/因子時更改我的代碼。

+0

歡迎來到SO。也許如果你展示了更多的代碼,並提供了一個最小化的工作示例,就像你提交問題時提示的那樣,這會讓人們更容易幫助你。 – hrbrmstr

+2

您可以使用列表索引和數據框架方法。 '集合(虹膜[1],虹膜[5],平均值)'與集合(萼片長度〜物種,虹膜,平均值)' –

+0

@RichScriven好的。 –

回答

0

嘗試使用setNames()。顯示了iris數據集

setNames(aggregate(iris[,1] ~ iris[,2], data = iris, mean), colnames(iris)[1:2]) 
+0

也可以,謝謝。 – EssenceBlue

3

如果你真的想使用索引和forumla接口實例:

index_agg <- function(formula, data, FUN, ...) { 

    require(formula.tools) 

    left <- as.numeric(lhs(formula)) 
    right <- as.numeric(rhs(formula)) 
    f <- paste0(colnames(data[,c(left, right)]), collapse=" ~ ") 

    aggregate(as.formula(f), data=data, FUN=FUN, ...) 

} 

head(index_agg(6 ~ 1, data=mtcars, FUN=mean)) 
## mpg  wt 
## 1 10.4 5.3370 
## 2 13.3 3.8400 
## 3 14.3 3.5700 
## 4 14.7 5.3450 
## 5 15.0 3.5700 
## 6 15.2 3.6075 

head(index_agg(5 ~ 1, data=mtcars, FUN=mean)) 
## mpg drat 
## 1 10.4 2.965 
## 2 13.3 3.730 
## 3 14.3 3.210 
## 4 14.7 3.230 
## 5 15.0 3.540 
## 6 15.2 3.110 

如果你不想formula.tools作爲一個依賴的更多信息:

index_agg <- function(formula, data, FUN, ...) { 

    left <- as.numeric(toString(formula[3])) 
    right <- as.numeric(toString(formula[2])) 
    f <- paste0(colnames(data[,c(left, right)]), collapse=" ~ ") 

    aggregate(as.formula(f), data=data, FUN=FUN, ...) 

}