質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

3239閲覧

RでExcelのピボットテーブルのような3次元のクロス集計を行いたいです

88yasu

総合スコア13

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2019/03/18 07:35

編集2019/03/18 18:21

Rを使って3次元のクロス集計をしたいと考えています。
これまでExcelのピボットテーブルで行っていた作業をR上で行いたいというイメージです。

分析対象データ
1列目(果物)には"りんご"、"みかん"、"いちご"
2列目(食べ方)には"がむ"、"ジュース"、"そのまま"
3列目(被験者名)には被験者名(重複=繰り返しあり)
4列目(おいしさ)には得点(10点満点)
がランダムに10万行程度入っているイメージです。

☆教えて頂きたいこと1
集計に当たってまず、りんごがむ、りんごジュース、りんごそのまま、みかん+がむ・・・いちごそのままのように5列目(果物*食べ方)に9種類のラベルを作成したいです。

現状:mutateやfilter関数を使うことまでは分かったのですが、どう書いていけばよいのか分かりません。

コード:
データ全体=p2018
1列目(果物)=ku りんごは0、みかんは1のような形式です
2列目(食べ方)=ta がむは0、ジュースは1のような形式です。
5列目(果物*食べ方)=kt

p2018 %>%
dplyr::filter(p2018$ku == 0, p2018$ta == 0) %>%
dplyr::mutate(kt = 1)
p2018 %>%
dplyr::filter(p2018$ku == 0, p2018$ta == 1) %>%
dplyr::mutate(kt = 2)
・・・kt=9まで続く
現状このようなコードを書いた後、p2018と入力するとktの列があると出力されるのですが、csv形式で出力するとkt列が出力されていません。

☆教えて頂きたいこと2
5列目(果物*食べ方)の9種類が被験者(3列目)ごとに平均何点なのかをクロス集計表で算出したいです。

現状:クロス集計をして度数を算出する方法はいくつか見つけました。aggregate関数を使い、被験者ごとの平均得点を求めることは出来たのですが、そこに”果物*食べ方”をクロスさせる方法が分かりません。
aggregateではなくdplyr関数を使った方が良いというような記載も見つけ、どうすれば良いかわからなくなっています。

コード:
被験者名=name
得点=sc
aggregate(p2018$sc, by=list(p2018$name), FUN=mean, na.rm = TRUE)

とすると、被験者ごとの平均得点を求めることは出来たのですが、ここに5列目(果物*食べ方)の変数をどう追加すればよいのかが分かりません。

今までRはExcelで整理したデータを統計にかける程度で使っており、R上でデータ整理することは結構難しいと感じている次第です。
どなたか教えて頂くことは出来ませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2019/03/18 07:38

これでは丸投げです。できたところまででいいですから貴方のRのコードを提示してください。
stdio

2019/03/18 07:40

全部公開されても困るだけなので、質問のとことだけ抜粋してお願いします。
88yasu

2019/03/18 07:48

ご指摘いただきありがとうございます。 どうやって質問したら良いかも分からない状態でした。 コードを追記いたします。
guest

回答1

0

ベストアンサー

とりあえず一番目の質問について。考え方は、まず特定の1行に注目し、既存の列データから新しい列を合成することを考えます。ここでは単純にpaste関数を使えばいいでしょう。excelのconcatenate関数に似た働きをします。paste("a","b")は"a b"を返します。

これが確認できたら、データフレームの列全体を対象とした式を組みます。Rの世界では、df[,1]あるいはdf[,"ta"]あるいはdf$taの形式で、「1列目」あるいは「taと名付けられた列」を指定できます。そして、あたかも単値同士の演算を行うかのようなスタイルで、データの集合体(ベクトル)を相手にした演算を表現できます。これを利用してデータフレームに新しい列を簡単に追加定義できます。

次に2番めですが、aggregate関数を使うのが簡単でしょう。引数として、集計したい列(群)・識別したい条件(群)・関数を指定します。また、by=、fun=などパラメータ名を明示した指定も可能で、この場合はパラメータの順序が前後しても構いません。

dplyrはうまく使えばデータの流れがわかりやすくなって有用ですが、最初はとりあえず忘れていいです。dplyrがなければできない処理というのは基本的にありません。まずはRでのデータ取り回しの基本を理解しないと、かえって混乱すると思います。

まとめると、だいたい次のようなコードになると思います。

#とりあえずテストデータをでっちあげる。 testdf <- read.table(text=" ku ta person score 1 1 Nishizumi 10 1 1 Isuzu 25 1 0 Reizei 30 0 1 Takebe 22 0 1 Akiyama 33 0 0 Nishizumi 23 1 0 Reizei 44 0 0 Isuzu 32 1 1 Nishizumi 45 0 1 Isuzu 69 1 0 Reizei 70 0 1 Takebe 72 1 1 Akiyama 74 0 0 Akiyama 76 1 0 Takebe 77 0 0 Nishizumi 80", header=T, stringsAsFactors=F) # 5列目(kuta)追加 testdf$kuta <- paste(testdf$ku, testdf$ta) # カテゴリごとの平均を出す r <- stats::aggregate( testdf$score, # testdfのうちscore列だけを対象にする by = list(testdf$kuta, testdf$person), # kutaとperson列でカテゴライズ FUN = mean ) print(r) # 結果をtab区切りファイルに書き出す write.table(r, sep="\t", file="out.txt")

投稿2019/03/18 15:14

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

88yasu

2019/03/18 18:29

質問の仕方を教えて頂いた上に、データを生成した上でコードを解説いただき本当にありがとうございます。 pasteという関数を使って合成すること、by=listのあとにクロスしたい変数を書いていくことが理解できました。 (自分が記載したコードにコピーの不足があったため再度追記いたしました) stats::と書く辺り、まだまだ理解できていないので自分で調べたいと思います。 本当にありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問