カテゴリー別アーカイブ: メモ

RStudio 1.0.143

MacのRStudioを新しいversion(1.0.143)にアップデートしました。

何が変わっているのかなと思ったら,Rmdでコードを実行した時に,もはやコードの実行結果がコンソール上に表示されなくなっていてびっくり。これはこれで便利なのかもしれないけど,慣れていなさすぎて逆に戸惑っています…

もちろん,コンソール上に直接打ち込んでいたり,R Script上で打ち込んでいれば結果はコンソールに出るのですが,RmdファイルのRチャンクをつかっている場合,そのチャンクの下に結果が表示されるようになっていて,大きいデータはGUIでポチポチするようになっています。

別ウィンドウに出せるようにもなっていて,Notebook Outputと呼ばれているようです。

多分出力の結果によってこのアウトプットのされ方も色々変わってくるのでしょうね。細かいことはまだよくわかってませんが,ちょっと使ってびっくりしたのはこの仕様でした。

個人的にはRStudioは好きで今まで使ってきていたのですが,これはなんかちょっと違うような…

なにをゆう たむらゆう

おしまい。

※追記

プロットも右下のペインではなくRチャンクの下に表示されるようになっているようです。

[R] データフレームの中の英文の語数を数える

以前,エクセルで英文の中の特定の単語までの語数を数えるという記事を書きました。今回はそれよりもっと単純で,Rのデータフレームの中の1部に英文が入っていて,その英文の語数を数えてデータフレームに付け足したいなっていう作業です。

%e3%83%96%e3%83%ad%e3%82%b0%e8%a8%98%e4%ba%8b%e7%94%a8_20170218

こんな感じでロング型のデータがdatという変数にあるとします。このデータフレームのなかの,sentenceという列には英文が入っていますが,それぞれ長さが違います。文が長いほうが反応時間も長くなっちゃいますから,そのために英文に含まれる語数を数えてそれも分析に使いましょうということです。僕がやっているような反応時間を扱う実験ではよくありがちな手続きです。本来なら刺激文作るときにそれもちゃんと数えておいて(エクセルで語数数えるのは簡単です。前掲の記事の一部がそれです),結果が出力される際にちゃんと語数の情報も含めておけばいいんですけど,まぁ今回はそれ忘れちゃったんでRの中でやってしまおうという事後的な対処法です。

さてさて前置きが長くなりました。Rでの文字列処理の基本は「分ける」・「数える」だと思います。僕はそんなにRで文字列処理しないんですが,今回の場合で言うと,データフレームの要素に含まれる英文をスペースで区切り,区切ったときにいくつかに分けられた要素の数を数えることで語数をカウントするという手続きになります。

今回使う関数は次の4つです。

  • (as.character関数)
  • strsplit関数
  • length関数
  • sapply関数

順番に説明していきます。strsplit関数は

strsplit(分けたいもの,区切り文字)

という感じで使います。今回の場合,分けたいのはdatの中のsentenceという列(dat$sentence)で,スペースで区切りますから,

strsplit(dat$sentence, ” “)

とすれば,

%e3%83%96%e3%83%ad%e3%82%b0%e8%a8%98%e4%ba%8b%e7%94%a8_20170218_2

こんな感じで単語ごとに区切ってくれます。この出力は1文ずつのリスト形式になっていて,そのリストの要素が英文を構成する単語になっています。もしも,このstrsplit関数がうまくいかなければ,

is.character(dat$sentence)

として,データフレーム中の英文が文字列形式で格納されているかどうか確かめてみてください。因子型(factorial)になっていると,strsplit関数は適用されません。これを変えるのが,as.character関数です。

strsplit(as.character(dat$sentence))

または,

dat$sentence<-as.character(dat$sentence)
strsplit(dat$sentence, ” “)

としてみてください。

さて,これでひとまず「区切る」作業はできましたが,まだ「数える」にはいたっていませんよね。数えるためによく使われるのが要素の数を数えるlength関数です。ただし,例えば

length(strsplit(as.character(dat$sentence)))

としてもうまくいきません。これでは出力されたリストの要素を数えるので,元のデータフレームの行数が表示されるはずです。ここでは,「リストのそれぞれの要素に対してlength関数を適用したい」わけなので,もうひと工夫必要です。そこで使うのがapply系列のsapply関数です。この関数は,

sapply(リスト,関数)

という形で引数を与えてあげると,リストの各要素に関数を適用してくれます。これと同じことができるのがlapply関数です。lapply関数を使うと,結果の出力もリスト形式で返されます。ただ,ここでは語数が並んだベクトル形式のものを手に入れて,それをもとのデータフレーム(dat)に追加したいわけなので,sapply関数のほうがベターです。lapply関数にすると,そのあとリストをベクトルに直すunlist関数を使う必要があって二度手間になってしまうので。というわけで,

sapply(strsplit(as.character(dat$sentence), ” “), length)

こうしてあげれば「スペースで区切る-> 語数を数える -> ベクトル形式で結果をゲット」という作業が完了します。あとは,

dat$num.words<-sapply(strsplit(as.character(dat$sentence), ” “), length)

としてあげれば,datに新しくnum.wordsという列が追加され,そこにはsentenceの列に入っている英文の語数が格納されることになります。めでたしめでたし。といきたいところなのですが,最後におまけでもうひとつ。

上の書き方だと,いくつもの関数が入れ子状態になっていて,一見して作業がわかりにくいですよね?そこでパイプ演算子を使って同じことをもう少しわかりやすく書き直してあげます。

dat$sentence%>% #datの中のsentenceという列を取ってくる
as.character%>% #文字列型に変換
strsplit(. , ” “)%>% #スペースで区切る
sapply(., length) -> dat$num.words #リストの要素ごとに語数を数えてdatというデータフレームのnum.wordsという列にいれる

こうやって書くと,作業の過程が見えてわかりやすいですよね。ちなみにこのパイプ演算子はパッケージ依存です。dplyrやtidyrを使うときに使うやつですね。たぶんこれらのパッケージを読み込んでいればパイプ演算子も使えるようになっているはずです。もともとはmagrittrというパッケージに入っているのがパイプ演算子が%>%なんですよね(たしか)?

というわけでlapplyの出力をunlistしてできたできたと思っていたらsapply関数の存在に気づいてなんだよ二度手間じゃんかよって思ったのでブログ記事にしました。

なにをゆう たむらゆう。

おしまい。

 

 

 

Excelで英文中の特定の単語までの語数を数える

自分の作業用のメモです。

博論の進捗が遅れすぎていていよいよやばくなってきました。そこで,ちょっとでも博論を進めるための作業をやっていて,プログラムの修正も済んだので,あとはプログラムに刺激文を流し込むだけになりました。そこでちょっとした問題発生。あまり詳しいことを書くとネタバレするので書けませんが,プログラムの中で,ある特定の単語数になった場合に処理をするというようなことをやっています。それが刺激文ごとに異なるので,配列変数にその単語数を指定しているのですが,100ちょいある刺激文をいちいち目視して何語目かを数えるとかやってられません。ちなみに刺激文自体はExcelファイルにまとめています。こんな感じで。

ブログ記事用_20160811

Excel上で単語数を数える関数は,ウェブ上で情報が見つけられます。いつも使っているのはこちら。

エクセル関数を利用して文字列中の英単語の数を数える

英文の中の特定の単語までの語数を数えるというのは,分解して考えてみればいくつかの作業に分けて考えることができます。

  1. 英文の中にある特定の単語をみつける
  2. 特定の単語の前にある文字列を抽出する
  3. 特定の単語の前にある文字列から単語の数を数える

という感じです。英文に含まれる単語数を数えるのは,上の3つのうちで3の作業になります。この単語数を数えるのはどういう原理かというと,つまりはスペースの数を数えるということです。英文にはスペース区切りで単語が入っているわけですから,スペースの数を数えて,それに1を加えた数が単語の数というわけです。

1は,特定の単語,つまり特定の文字列を探すということです。FIND関数を使うと,指定した文字列が現れる位置を探してくれます。そして,2の文字列の抽出にはMID関数が使えます。MID関数は,文字列の任意の位置から指定した文字数を抽出してくれます。このFIND関数とMID関数を組み合わせれば,特定の単語を見つけて,それより前にある文字列を抽出することができるわけです(参考サイト)。例えば,さきほどのExcelでD2に入っていた

The boy saw the cute girls in the park last week.

という文の中で,parkがtarget語であるとしましょう。そして,target語はF2に入れているとします。すると

=MID(D2,1,FIND(F2,D2,1)-1)

とすれば,parkの前までの単語をすべて抽出できます。

ブログ記事用2_20160811

FIND関数で指定した位置からだとその単語の先頭も含まれてしまうので,-1をしています。これで,1と2のステップができました。あとは,この抽出した文字列に含まれる単語の数を数えれば良いということになります。

単語の数を数えるには,引き算を使います。先ほど,スペースの数を数えれば良いと言いましたが,スペースを数えるには,スペースありの文字数(≠単語数)から,スペースなしの文字数(≠単語数)を引けば求めることができます。文字列を数えるのはLEN関数を使い,スペースの削除はSUBSTITUTE関数を使います(上記サイト参照)。先ほどの画像の中でG2に入っているセルの文字列を使うとすると,

=(LEN(G2)-LEN(SUBSTITUTE(G2,” “,””)))

とすれば単語数がカウントできます。ここで注意が必要なのは,通常英文の単語数をカウントする場合は+1をしないといけないという点です。例えば,次のような英文を考えてみます。

He is always shy.

普通英文はピリオドで終わっていて,その後ろにはスペースはありません。よって,単語の数よりスペースの数は1少ないことになります。ですから,数えたスペースに1を足すことで,単語の数を求めることができます。しかしながら,さきほど文字列抽出したときには,ある文字列(単語)の直前までの文字列を抽出しました。指定した文字列は単語であり,英文では単語の前には必ずスペースがあります。つまり,G2に入っている文字列の”the”のうしろには実はスペースが入っています。このため,単語の数とスペースの数が一致しており,最後に+1をする必要がなくなっているというわけです。

ここまでで,target語であるparkの前にある単語の数を求めることができました。もともとの目的は,「parkはその文の中で何語目なのか」でしたから,実は結局のところ,先ほどのものに最終的には+1をすることになります。この+1は,英文中に含まれる単語の数を数えるためにするものではなく,その次の単語(1語後ろ)が全体の何語目かを知りたいから行うということには注意が必要です。

ということで,賛否両論おありかと思いますが,私はガンガン埋め込み派なので,G2というセルに一旦吐き出してから計算するのではなく,LEN関数の中に,MIDとFINDを埋め込んでしまいます。

=(LEN(MID(D2,1,FIND(F2,D2,1)-1))-LEN(SUBSTITUTE(MID(D2,1,FIND(F2,D2,1)-1),” “,””)))+1

どん。

こうすれば,あとはF列にtargetとなる単語を刺激文の数だけ入力してさえあれば,「見つける->抽出する->数える」という3つのステップを表現した上の関数を別の列に縦にコピーするだけで自動的にtarget語の出現位置を計算することができるというわけです。

この方法がわかったおかげで目を細めながら単語の数をひたすら数えるという土方作業をやらずに済みました。ただし博論完成までは程遠いです(白目

なにをゆう たむらゆう

おしまい。

 

 

 

“Mac向け文章作成エディタ「Scrivener」のiPhone・iPadアプリがついに登場! | iTea4.0”

約1年ほど前から,論文執筆はMacでScrivenerを使っています。MBAはほとんど常に持ち歩きますから,研究室以外の場所でもMBAでガリガリ書けるのでかなり気に入っています。そのScrivenerのiOS版が出たみたいですね。MBAを買ってからはiPadは基本的にPDFの論文を読んだりKindleアプリで本読んだり,Duetでサブディスプレイとして使ったりという使い方をしています。そして先日,4,5年前アメリカにいた時に買って,MBAを2013年末に買うまで重宝していた折りたたみ式キーボードが壊れたので,いよいよiPadで物書きはしなくなるなぁと思っていたところです。そこにきてこのiOS版Scrivenerの登場。キーボードがあればiPadの方が軽くて気軽に持ち運べるので,ScrivenerのiOS版をかなり待ち望みにしていた人も多かったのではと思います。Mac版持ってたらFreeとかだったらよかったんですが,iOS版も2400円払って購入しないといけないんですね。そう考えると別にいままで通りMBAで執筆作業ってことでいいのかなと思っています。キーボードも買わないといけませんし。悩みます。

なにをゆう たむらゆう。

おしまい。


Macで人気の文章作成エディタ「Scrivener」のiPhone・iPadアプリが、2016年7月20日に「App Store」でリリースされました。

情報源: Mac向け文章作成エディタ「Scrivener」のiPhone・iPadアプリがついに登場! | iTea4.0

“【参院選2016】科学技術政策についての政党アンケート、結果を公開。 “

これは結構面白かった。選挙のときにgeneralに争点になる内容とは違って,自分の仕事に直接的に関わる政党のポジショニングや意見がわかったし,研究者の卵としてとてもありがたい試みだと思った。

 


情報源: 【参院選2016】科学技術政策についての政党アンケート、結果を公開。 | Science Talks

”Evernoteが無料ユーザーに厳しい変更、同期可能な端末を2台に制限”

数年前からEvernoteを愛用しています。使い方は多岐にわたっていて,単なるメモ書きだけにとどまらず,大事な書類をスキャンして放り込んだり,気になるウェブページをガンガンクリッピングしたりしています。研究のネタを書き留めたりもしますし,論文をいつどこに投稿するかの予定を書いておいたり,また実際に投稿した論文の審査過程をメモしてもいます。例えば,いつ投稿して,査読結果が来たのはいつで,修正原稿の〆切はいつで,手元に実物が届いたのはいつか,など。あとは,1度学会の年会費を払ったかどうかを確認できずに冷や汗かいたことがあるので,最近は振り込んだらその領収書をEvernoteに保存するようにしています。こういう小さい紙をスキャンするのに便利なのが,scannableというアプリで、かなり気に入っています。このアプリで書類や領収書などの写真を撮れば自動的にPDF化してくれて,そのままEvernoteに保存することができます(写真として保存することもできます)。scansnapがあれば必要ないかもしれませんが,いつでも気づいたときにパシャりとできて便利です。

さて,そんな便利なEvernoteですが,私のような使い方であれば基本的に無料のベーシックプランで問題ありませんでした。容量の制限が気になったこともありませんし,オフラインでノート共有できないときも最悪iPhoneがあります。どうしてもiPadやMBAで見たいときはデザリングすればいいですし。ところが,どうやらベーシックプランで利用する端末の制限がかかってしまうようなのです。私は現在ウェブアプリの他にiPhone,iPad,MBAでEvernoteを同期しており,2台までの制限だとどれか一つを切り捨てなければいけないことになります。MBAを買ってからは基本的に常にMBAを持ち歩いて作業しているので,iPadの利用頻度は以前に比べるとかなり減ってきています。そう考えると,iPadでは利用せずにiPhoneとMBAだけですませるということも考えられます。

アップグレードするとなると,容量が増えてオフラインでも使えるプラス版で年間3100円、さらにPDF内の文字検索にも対応するプレミアム会員で年間5200円になります。いままでベーシック版の機能だけで事足りていた私からすると,利用端末の制限を解除したいというだけで年間3100円も支払うべきなのか非常に悩ましいところです。

さてどうしましょう。もう少し悩みます。

なにをゆう  たむらゆう

おしまい。


Evernoteは6月29日、価格プランを改定すると発表しました。改定のポイントは2点。無料ユーザー(ベーシックプラン)がノートを同期できる端末を最大2つに制限することと、有料プラン(プラスプラン、プレミアムプラン)を大幅に値上げすることです。価格改定は2016年8月15日以降の更新日から適用されます。

情報源: Evernoteが無料ユーザーに厳しい変更、同期可能な端末を2台に制限 有料プランも大幅値上げ | アプリオ

Calendars 5で日本の休日が反映されない問題

iPhoneとiPadでは,Calendars 5というカレンダーアプリを長いこと使っています。基本はGoogleカレンダーに予定をいれて,それを同期させるという感じ。でも,結構前から日本の休日設定がCalendars 5にうまく同期されないという問題が発生していました。レビューを見てもこのことが書いてあったりしますが,アップデートしても改善されておらず,ネットを探しても解決策がわかりませんでした。Googleカレンダーの方にはちゃんと休日が表示されているので,Calendars 5に同期する段階でなにか問題があるということはわかったのですが。

それでついさっき,Calenders 5内でGoogleアカウントから一度サインアウトして再ログインしたらちゃんと表示されるようになりました。最初にiPadで再ログインして表示されるようになったので,iPhoneのアプリも開いてみると,こちらは表示されておらず,iPhoneでもサインアウトしてから再同期の手順でまたちゃんと休日が表示されるようになりました。

めでたしめでたし。

なにをゆう たむらゆう。

おしまい。