R:使用索引

时间:2016-09-18 15:45:57

标签: r

写作时: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] - 并且原始列名称将丢失。

如何使用索引并保留原始列名? 为什么我要使用索引?因为,每次我分析数据集中的新列/因子时,我都不想更改我的代码。

2 个答案:

答案 0 :(得分: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, ...)

}

答案 1 :(得分:0)

尝试使用setNames()。显示iris数据集

的示例
  setNames(aggregate(iris[,1] ~ iris[,2], data = iris, mean), colnames(iris)[1:2])