2017-08-23 12 views
0

私は、列g$zが列f$zからすべてのグループごとの値のリストが含まれているように、新しいデータフレームgにデータフレームfを集約したいと思います。一見、これは動作しているようだ:データフレーム内のリストの計算を行う

f = data.frame(x=c(1, 1, 1, 2), y=c(4, 4, 5, 6), z=c(11, 12, 13, 14)) 
g = aggregate(z ~ x + y, f, c) 

    x y  z 
1 1 4 11, 12 
2 1 5  13 
3 2 6  14 

今私は、データフレーム内のすべての行の列cにリストに異なる計算を行うと、同じデータフレームに新しい列に結果を入れたいです。しかし、これは動作しません!

g$m = sum(g$z) 
g$n = g$z + 1 

Error in sum(g$z) : invalid 'type' (list) of argument 

上記のようなデータフレームセル内でリストを操作するにはどうすればよいですか?それともこれは単にRのような/不可能なのでしょうか?もしそうなら、正しいアプローチは何ですか?

UPDATE

私の基本的な目標は、元のデータセットにXとYのすべての組み合わせでグループ単位の演算の多くを行うことです。 Rの一般的な選択肢は何ですか?

  1. applyを使用してください。プロ:1つのテーブルにすべて。 Con:複雑なテーブル構造。sumなどを使用できません。
  2. (y)、for(x)、サブセット。プロ:直接sumなどできます。 Con:たくさんのコードがあり、遅くなる可能性があります。
  3. 元のテーブルと集計テーブルで並行して作業します。プロ:できますsum等コン:データの複製。
  4. 他のオプションはありますか?
+0

'g $ m'の' sapply'は以下のようになります。そして 'g $ n - - relist(unlist(g $ z)+ 1、g $ z)' –

答えて

2

合計ベクトル化は、あなたは、単にタスクのためsapplylapplyを使用することができ、リストには適用されません。

g$m <- sapply(g$z, sum) 
g$n <- lapply(g$z, `+`, 1) 

g 
# x y  z m  n 
#1 1 4 11, 12 23 12, 13 
#2 1 5  13 13  14 
#3 2 6  14 14  15 

それともtidyverseを使用する場合は、あなたが使用することができますmap + mutate

g %>% mutate(m = map_dbl(z, sum), n = map(z, ~.x + 1)) 

# x y  z m  n 
#1 1 4 11, 12 23 12, 13 
#2 1 5  13 13  14 
#3 2 6  14 14  15 
+0

'sapply'ではなく' vapply'を使います。 'vapply'は常に既知の次元を持つ指定された型のベクトルを返します。 'sapply'は、入力に応じてベクトル、配列、またはリストを返すことができます。 –

+1

@NathanWerth - 返却構造は 'FUN'に依存し、' X'に依存します。 'sum'は常に長さ1の数値を返すので、' sapply'は常に原子ベクトルを返します( 'simplify = TRUE')。 'vapply'はもっと速いです。 –

+0

申請作品の使用!しかし、一般的なRのグループ単位のデータをうまく処理する方法を反映するために質問を更新しました。 – forthrin

関連する問題