[解決済み] 一度の呼び出しで複数の変数に複数のサマリー関数を適用する。
2023-01-23 06:35:03
質問
次のようなデータフレームがあります。
x <- read.table(text = " id1 id2 val1 val2
1 a x 1 9
2 a x 2 4
3 a y 3 5
4 a y 4 9
5 b x 1 7
6 b y 4 4
7 b x 3 9
8 b y 2 8", header = TRUE)
id1、id2でグループ化したval1、val2の平均を計算し、同時にid1-id2の組み合わせごとに行数を数えたいと思います。それぞれの計算を別々に行うことができるのですが。
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
一度の呼び出しで両方の計算を行うために、試しに
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
しかし、警告とともに文字化けした出力が出ます。
# m n
# id1 1 2
# id2 1 1
# 1.5 2
# 2 2
# 3.5 2
# 3 2
# 6.5 2
# 8 2
# 7 2
# 6 2
# Warning message:
# In rbind(id1 = c(1L, 2L, 1L, 2L), id2 = c(1L, 1L, 2L, 2L), val1 = list( :
# number of columns of result is not a multiple of vector length (arg 1)
plyrパッケージを使うこともできますが、私のデータセットはかなり大きく、データセットのサイズが大きくなるとplyrは非常に遅くなります(ほとんど使えません)。
どのようにすれば
aggregate
などの関数を使って、一度の呼び出しで複数の計算を行うにはどうしたらよいでしょうか?
どのように解決するのですか?
1つのステップですべてを行うことができ、適切なラベルを取得することができます。
> aggregate(. ~ id1+id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) )
# id1 id2 val1.mn val1.n val2.mn val2.n
# 1 a x 1.5 2.0 6.5 2.0
# 2 b x 2.0 2.0 8.0 2.0
# 3 a y 3.5 2.0 7.0 2.0
# 4 b y 3.0 2.0 6.0 2.0
これは2つのid列と2つのmatrix列を持つdataframeを作成します。
str( aggregate(. ~ id1+id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) ) )
'data.frame': 4 obs. of 4 variables:
$ id1 : Factor w/ 2 levels "a","b": 1 2 1 2
$ id2 : Factor w/ 2 levels "x","y": 1 1 2 2
$ val1: num [1:4, 1:2] 1.5 2 3.5 3 2 2 2 2
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "mn" "n"
$ val2: num [1:4, 1:2] 6.5 8 7 6 2 2 2 2
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr "mn" "n"
下記の @lord.garbage さんの指摘の通り、これは "simple" カラムを持つデータフレームに変換することができます。
do.call(data.frame, ...)
str( do.call(data.frame, aggregate(. ~ id1+id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) ) )
)
'data.frame': 4 obs. of 6 variables:
$ id1 : Factor w/ 2 levels "a","b": 1 2 1 2
$ id2 : Factor w/ 2 levels "x","y": 1 1 2 2
$ val1.mn: num 1.5 2 3.5 3
$ val1.n : num 2 2 2 2
$ val2.mn: num 6.5 8 7 6
$ val2.n : num 2 2 2 2
これはLHSに複数の変数がある場合の構文です。
aggregate(cbind(val1, val2) ~ id1 + id2, data = x, FUN = function(x) c(mn = mean(x), n = length(x) ) )
関連
-
R: 環境と変数のスコープ問題
-
Rでエラー:単項演算子への引数が無効
-
R - ユークリッド距離の計算を簡単にする方法
-
R言語における共通関数
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] Rで複数行のコメントを持つことは可能ですか?[重複している]。
-
[解決済み] グループ化関数(tapply、by、aggregate)と*applyファミリ
-
[解決済み] R dataframeでNAの値をゼロに置き換えるには?
-
[解決済み] リストやデータフレームの要素にアクセスするためのブラケット[ ]とダブルブラケット[[ ]]の違いについて
-
[解決済み] 複数の変数をグループごとに集計/要約する(例:合計、平均)。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Rでファイルを読み込む際に、そのようなファイルまたはディレクトリが見つかりません。
-
8.2 カマグラ(No.31〜No.40)
-
Rによる系統的クラスタリング(階層)分析のグラフ形式の完全版
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] R:自然対数を使った方程式をnlsで使う
-
[解決済み] パッケージ 'xxx' は利用できません (for R version x.y.z) 」という警告にどのように対処したらよいですか?
-
[解決済み] リストやデータフレームの要素にアクセスするためのブラケット[ ]とダブルブラケット[[ ]]の違いについて
-
[解決済み] Rで文字列から最後のn文字を抽出する
-
[解決済み】RでCRANミラーを選択する方法
-
[解決済み] データフレームのカラムのデータ型を決定する