65

データを集計した後、列の名前を変更できることはわかっています。

blubb <- aggregate(dat$two ~ dat$one, ...)
colnames(blubb) <- c("One", "Two")

それは何も悪いことではありません。しかし、一度に列を集約して名前を付ける方法はありますか? のような並べ替え:

blubb <- aggregate( ... , cols = c("One", "Two"))

どういうわけか元の列名をキャッチして次のようにすることは特に素晴らしい(そしてタイプミス防止)でしょう:

blubb <- aggregate( ... , cols = c(name_of_dat$one, name_of_dat$two."_Mean"))
4

4 に答える 4

85

次のように使用できますsetNames

blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two"))

または、洗練された数式メソッドをバイパスして、次のような構文を使用できます。

blubb <- aggregate(list(One = dat$one), list(Two = dat$two), ...)

アップデート

この更新は、自分でソリューションを導き出すことを開始するのに役立つだけです。

のコードを調べるとstats:::aggregate.formula、末尾に向かって次の行が表示されます。

if (is.matrix(mf[[1L]])) {
    lhs <- as.data.frame(mf[[1L]])
    names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
    aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
}
else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)

集計された変数に関数名を追加するだけの場合は、おそらく次のように変更できます。

if (is.matrix(mf[[1L]])) {
  lhs <- as.data.frame(mf[[1L]])
  names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
  myOut <- aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
  colnames(myOut) <- c(names(mf[-1L]), 
                       paste(names(lhs), deparse(substitute(FUN)), sep = "."))
}
else {
  myOut <- aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
  colnames(myOut) <- c(names(mf[-1L]), 
                       paste(strsplit(gsub("cbind\\(|\\)|\\s", "", 
                                           names(mf[1L])), ",")[[1]],
                             deparse(substitute(FUN)), sep = "."))
} 
myOut

これは基本的に をFUN使用して入力された値を取得deparse(substitute(FUN))するため、関数を変更してカスタム サフィックス、またはサフィックスのベクトルを受け入れることもできます。これはおそらくいくつかの作業で少し改善される可能性がありますが、私はそれを行うつもりはありません!

これは、この概念が適用された Gistであり、「myAgg」という名前の関数を作成しています。

結果の列名のみのサンプル出力を次に示します。

> names(myAgg(weight ~ feed, data = chickwts, mean))
[1] "feed"        "weight.mean"
> names(myAgg(breaks ~ wool + tension, data = warpbreaks, sum))
[1] "wool"       "tension"    "breaks.sum"
> names(myAgg(weight ~ feed, data = chickwts, FUN = function(x) mean(x^2)))
[1] "feed"                         "weight.function(x) mean(x^2)"

集計された変数名のみが変更されることに注意してください。ただし、カスタム関数を使用すると、非常に奇妙な列名になることにも注意してください。

于 2013-03-09T09:34:05.067 に答える
-4
w <- data.frame(Funding<-"Fully Insured",Region="North East",claim_count=rnbinom(1000, 300.503572818, mu= 0.5739467))
x <- data.frame(Funding<-"Fully Insured",Region="South East",claim_count=rnbinom(1000, 1000, mu= 0.70000000))
y <- data.frame(Funding<-"Self Insured",Region="North East",claim_count=rnbinom(1000, 400, mu= 0.80000000))
z <- data.frame(Funding<-"Self Insured",Region="South East",claim_count=rnbinom(1000, 700, mu= 1.70000000))
names(w)<-c("Funding","Region","claim_count")
names(x)<-c("Funding","Region","claim_count")
names(y)<-c("Funding","Region","claim_count")
names(z)<-c("Funding","Region","claim_count")
my_df <- rbind(w,x,y,z)
my_df2<-with(my_df, aggregate(x=claim_count, by=list(Funding,Region), FUN=sum))
colnames(my_df2)<-colnames(my_df)
于 2015-08-18T23:07:10.953 に答える