web-dev-qa-db-ja.com

Rの集約内の名前列

データを集計した後、列の名前を* re *できることを知っています。

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"))
51
user1322720

次のように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
_

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

a 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)"
_

集約された変数名のみが変更されることに注意してください。しかし、カスタム関数を使用すると、本当に奇妙な列名になってしまうことにも注意してください!

67

最初の質問に対する答えはイエスです。集計関数に列名を確実に含めることができます。上記の例の名前を使用します。

blubb <- aggregate(dat,list(One=dat$One,Two=dat$Two),sum)

元の列名を自動的に取り込む可能性についての部分が気に入っています。私はそれを理解した場合、私はそれを投稿します。

9
orville jackson

formulaとしてaggreagtesを書くことを好む場合、ドキュメントにはcbindの使用法が示されています。また、cbindを使用すると、aggregateで使用される引数に名前を付けることができます。

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

複数のグループ化要因による複数の列の集計は、次のように実行できます。

blubb <- aggregate(cbind(x = varX, y = varY, varZ) ~ cbind(a = facA) + cbind(b = facB) + facC, data=dat, FUN=sum)

また、複数の関数を使用する場合:

aggregate(cbind(cases=ncases, ncontrols) ~ cbind(alc=alcgp) + tobgp, data = esoph, FUN = function(x) c("mean" = mean(x), "median" = median(x)))

#   alc    tobgp cases.mean cases.median ncontrols.mean ncontrols.median
#1    1 0-9g/day  1.5000000    1.0000000      43.500000        47.000000
#2    2 0-9g/day  5.6666667    4.0000000      29.833333        34.500000
#...

これにより、colnameに使用される集約関数が追加されます。

ただし、cbindfactorsを内部コードに置き換えます。これを回避するには、次を使用できます。

with(esoph, aggregate(data.frame(cases=ncases, ncontrols), data.frame(alc=alcgp, tobgp), FUN = function(x) c("mean" = mean(x), "median" = median(x))))

#         alc    tobgp cases.mean cases.median ncontrols.mean ncontrols.median
#1  0-39g/day 0-9g/day  1.5000000    1.0000000      43.500000        47.000000
#2      40-79 0-9g/day  5.6666667    4.0000000      29.833333        34.500000
#...
0
GKi