見出し画像

DataFrameとの格闘[随時更新]

データフレームとは

R userにとってデータフレームの整理とは常に付きまとう問題である.
例えばツイッターをスクレイピングしてこんなデータが得られたとする.
(便宜上61~72行を載せている)

              Term  Info1    Info2  Freq
61              】     記号    括弧閉  269
62              >     記号    括弧閉    3
63              。     記号    句点 1440
64                    記号    空白  243
65              、     記号    読点 1473
66              ,     記号    読点    2
67            いい   形容詞     自立    1
68            ええ   形容詞     自立    1
69        おかしい   形容詞      自立    2
70        かわいい   形容詞      自立    1
71  きそくただしい   形容詞       自立    1
72        しつこい   形容詞      自立    2

考えることはいくつかあると思う.

Info1, Info2の要素(動詞とか自立とか)を指定したい
Freqの最低値を決めたい
Termの要素の長さ(「いい」なら2)を指定したい

このような問題に答えるには二つの関数を使う必要がある.

1.filter関数

filter関数は行を指定するのに便利な関数. dplyrパッケージの中に入っている. 尚よく使うパッケージに関してはあらかじめ起動しておくほうが良いだろう.

#よく使う関数
library(rvest)
library(magrittr)
library(RMeCab)
library(dplyr)
library(stringr)
library(httr)
library(tidyverse)

こんな感じにあらかじめ起動しておけば, いちいちlibrary()と打たなくてもよくなる.

filter関数で覚えておくべき点を下記にまとめた.

①引数はfilter(data, 条件)と書く
②大体の論理記号が使える
③stringrパッケージと並行して使う

①引数はfilter(data, 条件)と書く
引数はdata, 条件と書きましょう. よくあるミスですが,この条件部分に列名を記述すると思うのですが, データフレームの形式に従おうとしてエラーになる場合があります.

#下記のようにする必要はない
filter(data, data$Freq>5)

#下記のように書けばよい
filter(data, Freq>5)

②論理記号は大体使える
論理記号は大体使えます. まとめますが,詳細が気になった方は参考資料を見てください.

###数値の時
#等しい
filter(data,Freq=5)
#大きい,小さい
filter(data,Freq=5)

###文字列の時
#同じ文字列
filter(data, Term="きそくただしい")
#同じ文字列(複数=>OR)
filter(data, Term %in% c("きそくただしい","いい"))
#異なる文字列
filter(data, Term!="きそくただしい")
#異なる文字列(複数=>XOR)
filter(data, Term %in% !c("きそくただしい","いい"))
#***を含む文字列
filter(data, str_detect(Term,"きそく"))
#文字列の長さ(data[,1]で列を指定)
filter(data, str_length(data[,1]))

###論理記号
#AND「かつ」
filter(data, 条件1 & 条件2)
#OR「または」
filter(data, 条件1 | 条件2)
#AND以外
filter(data, xor(条件1 & 条件2))

困ったらこの表を見れば大体大丈夫です.
NA(データなし)の処理も比較的簡単にできます.

#NAの処理(NA以外を抽出)
filter(data, !is.na(Freq))

③stringrパッケージと並行して使う
後述する.

2.stringrパッケージ

stringrパッケージは文字列を指定するのに向いている関数が沢山ある.
今回はfilter関数の補助として使う.
そのため次の事項が分かっていればよい.

①引数に列を指定
②よく使う関数

①引数に列を指定
引数には列を指定する. ただし, 指定方法はdataframeの要素(data$Term)・列指定(data[,1])でも可能.

filter(data, str_length(data$Term)>=2)
filter(data, str_length(data[,1])>1)

②よく使う関数
使う関数のほとんどは今回の場合次の二つになる

1: str_length関数; 前者が文字列の長さを指定
2: str_detect関数; 後者が特定の文字列を指定

尚, detect関数は正規表現に対応している.

filter(data, str_length(data$Term)>1)
filter(data, str_detect(data$Term,"\\s"))

画像1

終わりに

初めてRに触ると混乱すると思うが, 以上のことを頭に入れておけばストレスの少ない作業を進めることが出来ると思う.

おまけ

   meta_strings                                   means_ms
1           \\d                                       数字
2           \\D                                   数字以外
3           \\w           アルファベット,数字,アンダーバー
4           \\W アルファベット,数字,アンダーバー以外の文字
5           \\s                                   空白文字
6           \\S                               空白文字以外
7             .                                 任意の文字
8             ^                               文字列の先頭
9             $                               文字列の末尾
10           \n                                       改行
11           \t                                       タブ

  nesting_quantifiers                      means_nq
1                   +         直前のパターンが1回以上続く
2                   ?  直前のパターンが0ないし1回以上続く
3                   *         直前のパターンが0回以上続く
4                 {n} 直前のパターンがちょうどn回以上続く
5                {n,}         直前のパターンがn回以上続く
6               {n,m} 直前のパターンがn回以上,m回以下続く

   meta_control                           means_mc
1            [] 指定された文字列のいずれか(文字列)
2            ()                         グループ化
3 \\p{Hiragana}                Unicodeプロパティ―

参考文献


この記事が気に入ったらサポートをしてみませんか?