初心者のための R および RjpWiki に関する質問コーナー

以下の 4 つの「●項目」のどれかをクリック!!


新規投稿欄: --- その前に,「投稿における注意事項」を読んでから!
このページの目次 --- 質問への回答・コメントの参照
最新のスレッド --- 最も最近に書き込まれた「親」記事(最新のコメントが付いた記事ではありません)
Q&A (初級者コース) 過去の目次 --- 今までの 15 個の書庫の参照


●● 目次 ●●

参照は,個々の項目をクリック(質問への回答・コメントの参照も,個々の項目をクリック)


まずは,「投稿における注意事項」を読んでください。
これに従わない場合には回答が得られにくい場合があります。

●● 新規投稿 ●●  




heatmapの縦横比率の調整について

ひい? (2016-07-28 (木) 17:16:22)


heatmap()を用いてヒートマップ図を描いています。以下のようにすると行方向の要
素数が縦方向の要素数より多いため、文字がつぶれてしまいます。
data <- as.matrix(read.table
("http://stat.biopapyrus.net/data/arraydata.txt", header=T))
heatmap(data)

引数cexRowで文字サイズを小さくするのではなく、heatmap図を縦方向に引き伸ばし
たいのですが、どのようにすればよいでしょうか。

環境はWindows 7、R 3.3.1です。どなたかご助言を宜しくお願いします。


lattice qqmathの軸交換

t^2? (2016-07-23 (土) 10:18:05)

初めて投稿します。よろしくお願いします。
latticeライブラリーのqqmath()を使用しています。
以下のようにすると、横軸qnorm, 縦軸xになります。
横軸x, 縦軸qnormで描きたいのですが、方法はありますか?

例:

library(lattice)
df <- data.frame(label=rep("A",200),x=rnorm(200))
df <- rbind(df, data.frame(label=rep("B",200),x=rnorm(200)*2))
df <- rbind(df, data.frame(label=rep("C",200),x=rnorm(200)*3))
gr <- qqmath(~x|label,data=df)
print(gr)

環境は以下です。

R version 3.2.2 (2015-08-14)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 8 (build 9200)

other attached packages:
[1] lattice_0.20-33

よろしくお願いします。


persp関数 の軸目盛表示について

こやP? (2016-07-08 (金) 15:23:01)

R初心者です。よろしくお願いします。

plot関数ではaxis関数と組み合わせて使用して軸の目盛を任意で変更することが出来るようです。

persp関数を使った作図で軸の目盛を自由に変更したいのですが方法はありますか?

R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)

よろしくお願いいたします。

  • 軸の目盛りはnticksオプションで増やしたり減らしたりできます。任意の場所にラベルを置きたい場合は、trans3d()を使うことになるでしょう。 -- S? 2016-07-08 (金) 21:57:05
## デモデータ
y <- x <- seq(-10, 10, length= 30)
f <- function(x,y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
z <- outer(x, y, f)
z[is.na(z)] <- 1
## 描画
p <- persp(x, y, z, theta = 50, phi = 30, expand = .3, col = "lightblue", axes = FALSE)
xa <- trans3d(pretty(x, n = 5), rep(min(y), 5) - .5, rep(min(z), 5), p)
text(xa, LETTERS[1:5])
ya <- trans3d(rep(max(x), 12) + .2, seq(min(y), max(y), length.out = 12), rep(min(z), 12), p)
text(ya, month.name, adj = 0, xpd = TRUE)
za <- trans3d(rep(min(x), 3), rep(min(y), 3) - .2, (0:2)*4, p)
text(za, c("low", "middle", "high"), adj = 1, xpd = TRUE)
persp.axes.png
  • ありがとうございました。 -- こやP? 2016-07-20 (水) 16:30:00

エラー対処

R初心者? (2016-07-02 (土) 18:36:05)

R初心者です.どうぞ宜しくお願い致します.
下記のエラーを消せないのですが,どこを修正すると良いのでしょうか?

Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : ~
  arguments imply differing number of rows:
  • エラーメッセージを示すのは当然必要ですが,そのエラーが出た行(およびそれより前の関連する行)を示さないと「どこを修正すると良いか」もへったくれもないということはおわかりじゃないのでしょうか。
    まあ,「複数の引数の行数が同じじゃないよ」,といっているわけですから,その通りのことをやったんでしょう。あなたにその心当たりがあれば,そこを直せば良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2016-07-03 (日) 06:08:30

subset

Rに困った人? (2016-06-29 (水) 20:54:30)

R初心者です.どうぞよろしくお願いいたします.

subset(x,条件式)を使って,階層ごとにデータ整理をしたいと考えております.
条件式にて,「x$area=="A市"」のようにすれば良いとは思うのですが,A市,B市,・・・Z市のように市区町村の数がたくさんあるので,何度も同じ作業をするのは厳しい状況です.何か良い方法はないでしょうか?

  • split を使うと良いでしょう。example(split) で利用例が示されます。 -- 河童の屁は,河童にあらず,屁である。? 2016-06-30 (木) 08:56:27
  • ご丁寧にありがとうございます. -- Rに困った人? 2016-06-30 (木) 15:30:59

文字列の日本語の除去

さぶ? (2016-06-09 (木) 11:14:33)

以下のような日本語と半角英数字の混在した文字列から、日本語を除去して半角英数字のみの文字列を作成したいのですが、どのような処理をすれば宜しいでしょうか。
"12wあsxいdr5日本6tgbhnuん89iko"
gsubで日本語のみを空文字に置換すればよいと考えたのですが、日本語を表す正規表現がないため実行できませんでした。

環境はWindows 7の32bit、R 3.3.0です。

お手数ですが、ご助言宜しくお願いします。

  • 【半角英数字「以外」】を表す正規表現を使う -- 2016-06-09 (木) 11:44:39
  • gsub("^:alnum:?","","12wあsxいdr5日本6tgbhnuん89iko") としてみましたが、日本語は英数字として認識されているように思われます。 -- さぶ? 2016-06-09 (木) 13:26:26
  • オンラインヘルプをよく読んでね。
    For example, [[:alnum:]] means [0-9A-Za-z], ...
    だから,半角英数以外は [^[:alnum:]] なんですよ。よくわからないものを使うより,基本的な [^A-Za-z0-9] を使えば間違いが少ないですね。 -- 2016-06-09 (木) 15:14:12
    > gsub("[^[:alnum:]]","","12wあsxいdr5日本6tgbhnuん89iko")
    [1] "12wsxdr56tgbhnu89iko"
    > gsub("[^A-Za-z0-9]","","12wあsxいdr5日本6tgbhnuん89iko")
    [1] "12wsxdr56tgbhnu89iko"
    > gsub("[ぁ-嶲]","","12wあsxいdr5日本6tgbhnuん89iko") # Unicode なら,これでもよいかも
    [1] "12wsxdr56tgbhnu89iko"
  • 私の環境では"[^A-Za-z0-9]"のみ目的の結果が得られ、"[^[:alnum:]]"は日本語を除去できず、"[ぁ-??]"はエラーになりました。環境によるのかもしれません。 -- さぶ? 2016-06-09 (木) 15:55:29

パスワードつきのエクセルファイルの読み込み方

X? (2016-06-08 (水) 17:08:46)

以下のようにパスワードでロックのかかったエクセルファイルを読み込みたいのですが、当然ながらエラーになってしまいます。

library(xlsx)
read.xlsx("file.xlsx", 1, header=T, encoding="UTF-8")
.jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl,  でエラー: 
org.apache.poi.EncryptedDocumentException: The supplied spreadsheet seems
to be an Encrypted .xlsx file. It must be decrypted before use by XSSF,
it cannot be used by HSSF

Rでパスワードを入力して読み込む方法があればご教示頂けますか。

宜しくお願いします。

  • これとか、これとか。 -- 2016-06-08 (水) 23:53:01
  • ありがとうございました。excel.linkが便利そうなので使用してみます。 -- X? 2016-06-09 (木) 09:35:47

一行ずつテキスト取り出して、各テキストファイルに書き出す方法

三回生? (2016-06-07 (火) 01:02:04)

大学三回生です。R初心者です。よろしくお願いします。

大学の授業で、データフレームを操作する課題がだされました。
内容は、21行(テキストデータ)1列のxxxx.csv(1行目は変数名)を読み込み、各行ごとにテキストファイルに書き出し、txtデータを20個分、保存するという課題です。
以下のように記述してみたものの、うまくいきません。

xxxx <-read.csv("xxxx.csv", header = TRUE)
n <- 1:20
for (i in 1:n) {      
  file.name <- sprintf("text_%02d.txt", i)
  dat[i] <- xxxx[i,]
  write.csv(dat[i], "file.name")    
}

どこが問題で、どのように修正するべきかを教えていただけますと幸いです。
よろしくお願いします。

  • 1度に全てをやろうとするから、問題点が見えないのでは。 -- 2016-06-07 (火) 11:21:26
    > 1:n
    [1] 1
     警告メッセージ: 
     1:n で:   数値式は 20 個の要素を持っています: 最初の要素だけが使われました  
    1つ1つ段階的に確認していけば、この時点で既に間違っていることに気づくでしょう。他にも、間違いがてんこ盛りです。1つ1つ潰していきましょう。
  • コメントありがとうございます。一行ずつ確認しました。ファイルは書き出されるようになりましたが、連番ではなく、またテキストファイルが壊れているため、開くことができません。 -- 三回生? 2016-06-07 (火) 22:58:33
    n <- 5
    for (i in 1:n) {      # i は 1, 2 が順次代入される
      x[i] <- xxxx[i,1]
      file.name[i] <- sprintf("text%03d.txt", i)
      write(x[i], file = "file.name[i]",  ncolumns = 1)
    }
  • file = "file.name[i]" と file = file.name[i] の違いがわかりませんか? --  ? 2016-06-08 (水) 05:14:52
  • 繰り返しますが、1度に全てをやろうとするから、問題点が見えないのでは。私は1行ずつ確認とは言っていません。1行丸ごとではなく1つ1つ確認されてはどうでしょうか。また、どうしていきなりfor文を実行するのでしょうか。i=1の場合に正しく動作するのを確認した後にforでループを書くのが問題解決への近道です。 -- 2016-06-08 (水) 08:32:10
    > file.name <- character() #次の行をいきなり実行するとエラーが出るのでとりあえずfile.nameを作成
    > file.name[1] <- "text001.txt" # i=1の場合を実行
    > "file.name[1]"
    [1] "file.name[1]"
    > file.name[1]
    [1] "text001.txt"
  • 大学の課題って...指導教員とのやり取りなんだろうか?↑ -- 2016-06-08 (水) 12:25:58
  • ↑ 確かに私は大学教員だしRも教えているけど、見ず知らずの課題と質問者です。 -- 2016-06-08 (水) 23:42:09
  • 時間がかかりましたが、無事にコードを作成できました。どこの大学の教員か存じ上げませんが、非常にわかりやすいご指導ありがとうございました。 -- 三回生? 2016-06-10 (金) 01:30:54

ggplot2のtheme_classicで軸が非表示になる

SATO? (2016-06-05 (日) 01:02:47)

R3.3.0でggplot2を使っています.図をシンプル(X軸とY軸のみ表示で,補助メモリも無し)にするためtheme_classic()を使うのですが,X,Y軸共に表示されません.以前に,ggthemesというパッケージをインストールしてからこのような症状が出始めたように感じています.また,R3.1.2やR3.0を使っていた時は問題なく使えていたのですが,どなたか解決方法をご存知の方は教えていただけないでしょうか.


ggplot2の戻り値,返り値の参照方法について教えてください

さかなねこ? (2016-05-24 (火) 04:56:38)

ggplot2の戻り値,返り値の参照方法について教えてください
たとえば,baseのhist関数だと描画後に返り値を参照して別のことに使いまわすことができますが,ggplot2でも同じようなことができるのでしょうか。

> h2 <- hist(iris[,1], seq(0,10,1))
> names(h2)
[1] "breaks"   "counts"   "density"  "mids"     "xname"    "equidist"
> str(h2)
List of 6
 $ breaks  : num [1:11] 0 1 2 3 4 5 6 7 8 9 ...
 $ counts  : int [1:10] 0 0 0 0 32 57 49 12 0 0
 $ density : num [1:10] 0 0 0 0 0.213 ...
 $ mids    : num [1:10] 0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5
 $ xname   : chr "iris[, 1]"
 $ equidist: logi TRUE
 - attr(*, "class")= chr "histogram"

となり,度数を取り出して別途表にすることなどができますが,ggplotだと,

> g <- ggplot(  iris,   aes(x=Sepal.Length))
> g <- g + geom_bar(stat ="bin")
> plot(g)
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
> names(g)
[1] "data"        "layers"      "scales"      "mapping"     "theme"      
[6] "coordinates" "facet"       "plot_env"    "labels"     

となり,度数データがどこにあるのかわかりません。
ggplotで作ったグラフの数値データ(返り値,戻り値)はどこに格納されているのかご存知の方教えていただけないでしょうか。
下記サイトによれば,どこかにしまわれているように思えるのですがわかりませんでした
https://github.com/hadley/ggplot2-book/blob/master/layers.rmd#generated-variables

  • ggplot なんかおやめなさい --  ? 2016-05-24 (火) 22:16:14
  • 確かに,facet_wrap, gridが便利で目立ちますがbaseを極めるのも手かも知れないですね -- さかなねこ? 2016-05-25 (水) 05:01:06
  • ggplotユーザではないので、外しているかもしれませんが、次のようにして得られませんか。 -- 2016-05-26 (木) 19:01:44
    > a <- plot(g)
    > a$data[[1]]$count
    [1]  4  1  4  2 11 10  9  4  7  7  6  8  7  9  6  4  9 12  2  8  3  5  1  3  1  1
    [27]  1  4  0  1
  • まさに欲しいものが得られました! gではなくてplot(g)を調べればよかったのですね。大変助かりました。ありがとうございます。 -- さかなねこ? 2016-05-27 (金) 21:47:47

rpartの学習済みモデルのsaveとloadについて

yu? (2016-05-18 (水) 23:01:45)

rpartで学習した結果のモデルを保存したいのですがその方法がわからず、記載されているページもなかったのでご教授頂きたく思います。
例えば下記のようにしても、エラーが出て保存することができません。

また可能でしたらモデルを読み込んで使用する方法もご教授いただけたらと思います。

ct <- rpart(answer ~ hit + num, method = "class" ,  control=rpart.control(minsplit=5, cp=0.003, loss=matrix(c(0,1,4,0), byrow=TRUE, nrow=2)))
rpart.plot(ct, type = 1, uniform = TRUE, extra = 1, under = 1, faclen = 0)
write(data.frame(ct), "c:\\rdata\\tree.txt")
  • コンソールに表示されるものをそのままファイルに保存したいなら,sink 関数を使えばよいですよ。
    バイナリ形式での保存と読み込みならば,あなたの記事のタイトルにあるけど save 関数と load 関数を使えばよいのです。
    それぞれの関数の使い方はオンラインヘルプを参照のこと。 -- 河童の屁は,河童にあらず,屁である。? 2016-05-19 (木) 09:01:41
  • ありがとうございます。できました -- yu? 2016-05-19 (木) 22:13:54

MeCab?の辞書、mecab-ipadic-NEologdを追加できません。

初心者? (2016-05-09 (月) 23:21:04)

以下の手順でmecab-ipadic-NEologdのインストールをおこないました。

1. git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
2. cd mecab-ipadic-neologd
3. ./bin/install-mecab-ipadic-neologd -n

3.の手順を実行したあとに以下のような記述が表示されましたので、
mecab-ipadic-NEologdのインストールが成功したものだと思っていました。
(浅学で申し訳ないのですが、okがたくさん出ておりましので成功だと考えました。)

[install-mecab-ipadic-NEologd] : Start..
[install-mecab-ipadic-NEologd] : Check the existance of libraries
[install-mecab-ipadic-NEologd] :     find => ok
   : 【途中省略】
[install-mecab-ipadic-NEologd] :     diff => ok
[install-mecab-ipadic-NEologd] :     tar => ok
[install-mecab-ipadic-NEologd] :     unxz is not found.

そして公式にあるように以下の文言を実行しましたが、エラーが表示されました。

echo "10日放送の 【途中省略】 一幕があった。" | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
param.cpp(69) [ifs] no such file or directory:
   /usr/local/lib/mecab/dic/mecab-ipadic-neologd/dicrc

どうすればこの問題を解決できますでしょうか。ご教授いただければ幸いです。

  • 原因は書いてるじゃないですか。> unxz is not found. -- wakakumo? 2016-05-10 (火) 00:09:17
  • > unxz is not found. -- 初心者? 2016-05-10 (火) 10:49:21
  • > unxz is not found. -- 初心者? 2016-05-10 (火) 10:49:22
  • これが原因だったのですね。 > unxz is not found. これは、どのようにすれば解決出来るのでしょうか。 -- 初心者? 2016-05-10 (火) 10:51:03
  • 書いてあることを書いてある通りに実行できないんですか? https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md#user-content-%E5%8B%95%E4%BD%9C%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%82%E3%81%AE -- wakakumo? 2016-05-10 (火) 11:36:18
  • 程度にもよるけど,初心者さんには,そのページ見ても,どうしていいかわからないんじゃない?わかるなら,ここで,こんな質問していないだろうし。
    質問者も,あなたの OS の種類くらい明示した方がいいんじゃない?質問の前にということで,注意事項がかいてあるでしょうが。
    回答者の方も,いらだつ気持ちもわかりますけどね。そもそも,install.packages だけでちゃんと動くようにしてあげないメインテイナも,大人げないというか自己満足におちいっているんじゃないか?「それなりの手順を踏んでもらいてえんで。使えないなら,使ってもらわなくても結構でさあ。」というのは,どうだかなあと思うけど。
    わたしやねえ,そんなもん使えなくても一向苦にならないけど。使いたい人にとっては,それじゃあ,冷たすぎるんじゃねえかってことよ。「素人には使ってもらわなくても結構だ!」ということなんだろうかねぇ。初心者の皆様,お気の毒さま。「そんなんじゃあ,使ってやんないよ!!」っていえばよい(^_^) -- 河童の屁は,河童にあらず,屁である。? 2016-05-10 (火) 22:21:07
  • 投稿方法,一向に進歩しませんな〜〜 -- 河童の屁は,河童にあらず,屁である。? 2016-05-10 (火) 22:32:47
  • unxz, iconv, homebrewを再度入れ直しました。その結果、Could not resolve hostというエラーがでましたが、違うwifiに繋ぎ直したところ無事に辞書が使えるになりました。また、ターミナルで内容を書き変え、RMeCab?のデフォルト辞書に設定することができました。以後、投稿に関する注意事項に気をつけます。皆様ありがとうございました。 -- 初心者? 2016-05-10 (火) 23:29:27
  • unxz, iconv, homebrewを再度入れ直しました。その結果、Could not resolve hostというエラーがでましたが、違うwifiに繋ぎ直したところ無事に辞書が使えるになりました。また、ターミナルで内容を書き変え、RMeCab?のデフォルト辞書に設定することができました。以後、投稿に関する注意事項に気をつけます。皆様ありがとうございました。 -- 初心者? 2016-05-11 (水) 00:23:29
  • 「以後、投稿に関する注意事項に気をつけます。」なら、さっそく、このページの上端部にある「編集」をクリックして、2重書き込みになっちゃった箇所の削除をしようよ。Wikiというのは(性善説に基づいて)誰でも自由に編集できてしまうシステムなのです。 -- 2016-05-11 (水) 09:14:41
  • まあ,無理な要求でしょう。 -- 2016-05-11 (水) 21:07:08

MeCab?に辞書を追加できません。

初心者? (2016-05-08 (日) 19:00:31)

RMeCab?でテキストマイニングを行っています。解析結果で文字が正しく解析されていないので、MeCab?の辞書に単語を追加しようと思っていますが、全くうまく行きません。ご教授願います。

環境は以下の通りです。
Mac10.10.5
R studio 0.99.489
R version 3.2.2
mecab-0.996
mecab-ipadic-2.7.0-20070801

http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html
http://r-kurain.hatenablog.com/entry/20120725/1343226646
http://www.inabalab.net/yokoyama/statics/r%E3%81%A7%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B02/
上記のサイトにあるように、以下のフォーマットに沿ってwords.csvという名前でcsv形式(UTF-8)を作成しました。

そして、ターミナルから以下のコマンドを実行したところ、()内のエラーが表示されてしまい、ここから先に一向に進めません。

$/usr/local/Cellar/mecab/0.98/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.98/lib/mecab/dic/ipadic -u words.dic -f utf8 -t utf8 words.csv
(-bash: $/usr/local/Cellar/mecab/0.98/libexec/mecab/mecab-dict-index: No such file or directory)

or

$/usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic -u words.dic -f euc-jp -t euc-jp words.csv
(-bash: $/usr/local/libexec/mecab/mecab-dict-index: No such file or directory)

このようなエラーが表示された場合、どのようにすれば単語を追加できますでしょうか。
よろしくお願いします。

また、アンインストールしようとしても()内のエラーが表示され実行できませんでした。

cd ~/Downloads
cd mecab-ipadic-2.7.0-20070801
sudo make uninstall
(make: *** No rule to make target `uninstall'. Stop.)

cd ~/Downloads
cd mecab-0.996
sudo make uninstall
(make: *** No rule to make target `uninstall'. Stop.)

  • $はプロンプトを示す記号なので、入力する必要はありません。また、登録したい語が世間一般でもわりと使われているものであれば、イマドキはmecab-ipadic-neologdを導入するのが一番楽ではないでしょうか。 -- wakakumo? 2016-05-08 (日) 23:23:35

時系列csvデータの読み込み

しょうもない初心者? (2016-05-05 (木) 18:04:30)

書き込みが少々気が引けますが、本を買って読み始めたばかりの超初心者です。

これまでエクセル表の上だけで、何とかマクロを使ってデータ分析を行って来ましたが、Rの持つ時系列データの分析機能を試してみたく、質問をさせて頂きます。

データはデマンド計1年分の横軸時刻、縦軸日付で、下記の様な構造をしています。
文字列でアップすると見ず(づ)らいのですが、横が48列、縦が365行の17,520個のデータです。

日付\時刻 0:30 1:00 1:30 2:00 2:30 3:00 3:30   …  23:30 0:00 (→計48列)
2015/7/1   51.3 49.8 52.0 51.7 62.2 70.5 88.6   …  156.1 148.2
2015/7/2   64.3 60.0 57.4 58.8 64.5 70.5 84.3   …  204.2 211.9
  …
2016/6/29  42.3 44.4 50.2 63.4 87.5 99.0 105.6  …  253.0 244.1
2016/6/30  52.8 73.5 70.9 82.5 88.4 82.3 120.3  …  324.4 318.2
(↓計365行)

このデータをcsv形式で保存して、read.csvで読み込もうと色々と試したのですが、plot.ts等でプロットしようとしても受け付けられず、入力がうまくいっていない様です。
日付と時間との1:1データですので、下記の様な2列のデータに直せばうまくゆきそうな感じもしますが、もし上記のまま上手く読み込む方法がありそうでしたら、アドバイスをお願い致します。

Date-Time            Demand
2015/07/01-00:30:00   51.3
2015/07/01-01:00:00   49.8
  …
2016/06/30-23:30:00  324.4
2016/06/30-00:00:00  318.2
  • 転記をありがとうございましたm(_ _)m -- しょうもない初心者? 2016-05-05 (木) 18:13:56
  • 転記をありがとうございましたm(_ _)m -- しょうもない初心者? 2016-05-05 (木) 19:19:47
  • 時刻ごとのデータを縦に結合して、それに日付をcbindすればよいのでは。 -- wakakumo? 2016-05-06 (金) 01:15:53 日付を繰り返し生成するには、たとえば、以下のように。
    startdate<-as.POSIXlt("2016-04-01")
    enddate<-as.POSIXlt("2016-06-30")
    date_range<-seq(startdate,enddate,by="1 day")
    repeats<-48
    repeated_dates<-as.POSIXlt(as.character(NULL))
    tmp<-as.POSIXlt(as.character(NULL))
    for (i in 1:length(date_range)){
    	 tmp<-rep(date_range[i],repeats)
    	 repeated_dates<-c(repeated_dates,tmp)
    }
  • wakakumo様 早速のご指南をありがとうございました。まだデータがどの様な形で読み込まれているのかも確認する方法を理解していない未熟者で恐縮ですが、頂いたご提案を理解出来る様になって試させて頂きたいと思います。 -- しょうもない初心者? 2016-05-06 (金) 12:40:42
  • for を使う必要はない。メモリ確保を気にしなくてよいし。c を使って結合していくのは最悪。
    startdate <- as.POSIXlt("2016-04-01")
    enddate <- as.POSIXlt("2016-06-30")
    date_range <- seq(startdate,enddate,by="1 day")
    repeats <- 48
    repeated_dates <- rep(date_range, each=repeats) # この一行だけだ
    爆速だし。 -- 河童の屁は,河童にあらず,屁である。? 2016-05-06 (金) 17:45:22
  • 参考になります。ありがとうございました。 -- wakakumo? 2016-05-06 (金) 18:41:36
  • ありがとうございました。月曜に実データで試させて頂きます。重ねてお二方に感謝を申し上げます。 -- しょうもない初心者? 2016-05-07 (土) 23:10:35

Rcpp(C++)で作成した3次元配列をRに連携する方法

(2016-04-04 (月) 12:56:10)

Rcppを使ってRとC++の連携(下記1-3)を行いたいと思っています。

1.RからC++へ2つの行列を渡す
2.2つの行列を元に特定処理を実行し、3次元配列を作成
3.2で作成した3次元配列をRに返す

3の方法が分からず、、、もしよければ助言いただけないでしょうか
具体的には下記コードで定義したfuncmatの戻り値の型として何を指定すれば
3次元配列を返すことができるのでしょうか?
====下記Rコード====

library( Rcpp )
library( RcppArmadillo )
 
test <-'
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;

// [[Rcpp::export]]
Type funcmat(NumericMatrix A, NumericMatrix B) {

int XXXX[10][20][30];

//行列A、Bに関する処理をXXXXに代入

return (XXXX);
}

'
sourceCpp(code=test)

a <- matrix(1:100,10)
b <- matrix(2:101,10)

c <- funcmat(a,b)
  • 素直に最初から最後までを C++ で書くことをお勧めします。そのほうが早いし,C++ で全部書けることを前提とした Cpp だと思うわけですよ。C++ で書けないのに R を介すれば書けるんじゃないかというのは,幻想じゃないか?本末転倒。 -- 河童の屁は,河童にあらず,屁である。? 2016-04-04 (月) 19:45:21

自作関数の各役割について教えて下さい

初学者? (2016-04-01 (金) 21:35:40)

column_name <- function(name, ...) {
paste0(name, "[", paste(..., sep = ","), "]") }

上記のfunction(name, ...)の...はどのような役割があるのでしょうか。
また、2行目のpaste0()内は何をどうしようとしているのでしょうか。

よろしくお願いします。

  • ...はdotsMethodsのヘルプを参照。paste0の中身はpaste()の結果を"["と"]"で囲って、その先頭にnameの内容をつけるという処理をしています。paste()は、...の中身を","で区切って出力しています。 -- 2016-04-01 (金) 22:30:16
  • pste0 は paste の sep = " " を除いたものです
    paste (..., sep = " ", collapse = NULL)
    paste0(..., collapse = NULL)
    昔はなかった(paste を使っていた)。近年になってから定義されました。 -- 2016-04-02 (土) 10:11:33
  • 理解できました。ありがとうございました。 -- 初学者? 2016-04-02 (土) 13:07:12

変化をプロット・グラフ化

Rに困ったさん? (2016-03-21 (月) 00:27:54)

例としまして,下記のようなデータがあるとします.

ID year distance density pattern
1  2010    20000   1000   move1
1  2011    25000   2000   move1
2  2010    15000   2000   move2
2  2011    12000   1000   move2

縦軸がdistance,横軸がdensityのグラフを作成します.
IDが1の前年(2010)と本年(2011)をプロットし,2点を線で結びたいです.
IDが2も同様にします.
IDが1とIDが2のデータは同じグラフ上に示したいです.
さらに,patternがmove1とmove2で色分けできると嬉しいです.

R初心者です.Rでの表現方法をご存知の方がいましたら,ご教示して頂けると助かります.

  • どこまで一般化すればよいのかわからないので,取りあえず以下のようなプログラム。 -- 河童の屁は,河童にあらず,屁である。? 2016-03-21 (月) 10:37:33
    d <- read.table("data0321.R", header=TRUE)
    f <- split(d, d$ID)
    plot(d$density, d$distance, type="n")
    junk <- sapply(f, function(x) lines(x$density, x$distance, col=as.integer(x$pattern)))
  • 非常に参考になりました.ありがとうございます. -- Rに困ったさん? 2016-03-22 (火) 14:44:41

ICCパッケージでエラー

もち? (2016-03-15 (火) 10:04:14)

ICCパッケージを以前使用した時は問題無く計算できていたのですが、最近あらためて使用してみるとエラーが帰ってきました。
何か情報をお持ちの方がいらっしゃったらお教え下さい。

> library(ICC)
> data(ChickWeight)
> ICCbare(Chick, weight, data = ChickWeight)

 aggregate(y ~ x, data = tdata, FUN = length) でエラー: 
   使われていない引数 (data = tdata, FUN = length) 

ICC version 2.3.0
R version 3.2.4 (2016-03-10)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.3 (El Capitan)
  • 同じ環境のようですが,何の問題もなく動きましたが?
    もしかして,aggregate という名前のユーザ定義の関数があったりするか?
    コンソールに aggregate と打ち込んで,なにが返るか見てみるとか... -- 河童の屁は,河童にあらず,屁である。? 2016-03-15 (火) 11:39:13
  • 仰るとおりでaggregateという関数を消したら正常に動きました。昨日から何時間も困って検索等をしていました。本当に有難うございます。 -- もち? 2016-03-15 (火) 12:55:34

CRLFとLFの改行コードが混じったファイルを改行して読みたい

たく? (2016-03-14 (月) 13:53:15)

お世話になります。read.tableでファイルを読む際に、元のファイルが2つの改行コードが混じっているようなので、どちらの改行も改行として読みたいと思います。文字コード自体を変えてしまうとどちらかしか読んでくれないようですしUTF-8の日本語も中に交じっているのですが、どのような方法がありますでしょうか。

  • OS はなんですか?日本語は UTF-8 だけなんですか?それとも CP932 とかもまじっているとか?
    Mac OS X だと UTF-8 の日本語が入っていて,CRLF と LF (さらには CR だけ)が混じっていてもちゃんと読めますが? -- 河童の屁は,河童にあらず,屁である。? 2016-03-14 (月) 15:50:18
  • ありがとうございます。環境がなく失礼しましたwindowsです。 ひとまずx2 <- strsplit(x1[,1],"\n")として切ることはできましたが、 リストで読まれている部分を1列に結合する以下のような操作がうまくできずにまだ悩んでおります。
     a <- list(0)
     a[[2]] <- c(1:5)
     func1 <- function(x){rbind(matrix(x,ncol=1))}
     do.call(func1, a)
    forで書けなくもないですが-- たく? 2016-03-15 (火) 16:04:01
  • a <- list(0) ; a[[2]] <- c(1:5) ; do.call("rbind", a) かな? -- 2016-03-15 (火) 16:20:00
  • また説明が不足しており、すみません。rbind(a[[1]],matrix(a[[2]]))の結果のようにしたいのです。strsplitで切ったリスト(ここのaa[[2]]に相当)を、他の読んだもの(ここのaa[[1]]に相当)と縦に並べられるとCRLFもLFも改行して読んだのと同じ結果になるのですが。 -- たく? 2016-03-16 (水) 17:46:39
  • 抽象的な話ばっかりで,らちがあかない。データを簡単にして,どのようにやりたくて,あなたがどのようなプログラムを書いたか,具体的に書くのが一番でしょう。データ例はアップロードすればよいし,プログラムはそんなに長くないなら,掲示板に書き込めばよい。いずれにしろ,あなたの説明力での数行の「説明」でわかるわけがない。
    パソコン屋さんにいって Mac を買うのも解決法かも知れない。 -- 河童の屁は,河童にあらず,屁である。? 2016-03-16 (水) 21:30:57

漸化式の計算

さくら? (2016-03-12 (土) 17:46:42)

漸化式を計算して,
結果を順番に示す方法を教えてください.
例えば,
Vn+1=2*Vn+3*Vn    で初期値を 0.5 にします.
お願いします.

  • 2*Vn+3*Vn って 5*Vn でしょ? -- 河童の屁は,河童にあらず,屁である。? 2016-03-12 (土) 18:37:26
  • Vn+1=2*Vn+5*Vn^3 でした.すみません. -- さくら? 2016-03-12 (土) 18:53:50
  • あっという間に Inf になるような例題ですが,あくまでも例題ということで,2通りの解を(規則性からいえば,一行のベクトル演算でできるが,それは質問者の意に沿わないと思うので) -- 河童の屁は,河童にあらず,屁である。? 2016-03-12 (土) 19:14:15
    > n = 10
    > # ベクトルとして保存したいなら
    > a = numeric(n+1)
    > a[1] = 0.5
    > for (i in 1:n) {
    + 	a[i+1] = 2*a[i] + 5*a[i]^3
    + }
    > a
     [1]  5.000000e-01  1.625000e+00  2.470508e+01  7.544201e+04  2.146890e+15  4.947651e+46 6.055741e+140
     [8]           Inf           Inf           Inf           Inf
    > # 単に表示するだけなら
    > v1 =0.5
    > for (i in 1:(n+1)) {
    + 	print(v1)
    + 	v2 = 2*v1 + 5*v1^3
    + 	v1 = v2
    + }
    [1] 0.5
    [1] 1.625
    [1] 24.70508
    [1] 75442.01
    [1] 2.14689e+15
    [1] 4.947651e+46
    [1] 6.055741e+140
    [1] Inf
    [1] Inf
    [1] Inf
    [1] Inf
  • > -- さくら? 2016-03-12 (土) 21:03:02
  • ありがとうございます. >をいれるとエラーがでてしまいます.>をはずしてもエラーが出てしまいます. -- さくら? 2016-03-12 (土) 21:05:15
  • 実行例のコンソール出力そのままを示したのだから,> と + で始まる部分がプログラムそれ以外は出力結果。> と + を除いた,プログラム部分を入力するんですよ。 -- 河童の屁は,河童にあらず,屁である。? 2016-03-13 (日) 08:43:27
  • 参考までに -- 2016-03-14 (月) 13:24:39
    > # 有理数型
    > library(gmp)
    > n <- 10
    > a<-rep(as.bigq(0),n+1)  # n+1の配列(実体はリスト)確保
    > a[[1]]<-.5
    > for (i in 1:n) {a[[i+1]] = 2*a[[i]] + 5*a[[i]]^3}
    > a[1:5]                  # 長いので1:5まで
    Big Rational ('bigq') object of length 5:
    [1] 1/2                                                               
    [2] 13/8                                                              
    [3] 12649/512                                                         
    [4] 10125654696157/134217728                                          
    [5] 5190860329874751989362836598824695980441/2417851639229258349412352
    ちょっと[[のところがトリッキーかもしれません
    > # 多倍長
    > library(Rmpfr)
    > n <- 10
    > prec <- 512              # 2進数での有効桁数
    > floor(log10(2^prec))     # 10進数での有効桁数の確認
    [1] 154
    > a<-rep(mpfr(0,prec),n+1) # n+1の配列確保
    > a[1]<-".5"               # 文字列にするのは.3などの場合,一旦doubleの
    >                          # 精度にパーサー上で落ちてしまうので文字列
    >                          # として与える
    > for (i in 1:n) {a[i+1] = 2*a[i] + 5*a[i]^3}
    > a[1:4]                   # 長いので4まで
    4 'mpfr' numbers of precision  512   bits 
    [1]                               0.5                             1.625
    [3]                      24.705078125 75442.006410337984561920166015625
    どちらも項内に多倍長のクラスがあるのでなんですが, doubleで演算しないように注意は必要です.
  • 丁寧に書いてくださってありがとうございます.いろいろやってみます. -- さくら? 2016-03-14 (月) 19:17:10

Mac で sem パッケージが使えない

sem? (2016-03-10 (木) 11:13:06)

パッケージ sem を使おうとすると,以下のようなエラーメッセージが出ます

> library(sem)
Error :  .onLoad は loadNamespace()('tcltk' に対する)の中で失敗しました、詳細は: 
  call: dyn.load(file, DLLpath = DLLpath, ...) 
  error:  共有ライブラリ '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/tcltk/libs/tcltk.so' を読み込めません: 
  dlopen(/Library/Frameworks/R.framework/Versions/3.2/Resources/library/tcltk/libs/tcltk.so, 10): Library not loaded: /usr/X11/lib/libXft.2.dylib
  Referenced from: /usr/local/lib/libtk8.6.dylib
  Reason: image not found  
 エラー:  ‘sem’ に対するパッケージもしくは名前空間のロードが失敗しました 

なお,tcltk.so は実在しています

-rwxrwxr-x  1 root  admin  46268  1 25 14:13 /Library/Frameworks/R.framework/Versions/3.2/Resources/library/tcltk/libs/tcltk.so*

> file('/Library/Frameworks/R.framework/Versions/3.2/Resources/library/tcltk/libs/tcltk.so')
                                                                         description 
"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/tcltk/libs/tcltk.so" 
                                                                               class 
                                                                              "file" 
                                                                                mode 
                                                                                 "r" 
                                                                                text 
                                                                              "text" 
                                                                              opened 
                                                                            "closed" 
                                                                            can read 
                                                                               "yes" 
                                                                           can write 
                                                                               "yes" 

sem のバージョン情報は以下の通り(確認した範囲で最新)

Package:            sem
Version:            3.1-6
Date:               2015-06-09

Macintosh で,OS のバージョン情報は以下の通り(最新)

OS X El Capitan
バージョン 10.11.3

R の sessionInfo は以下の通り(最新)

R version 3.2.3 Patched (2016-01-23 r69993)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.3 (El Capitan) 

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.3      lattice_0.20-33  matrixcalc_1.0-3 MASS_7.3-45      grid_3.2.3      
 [6] arm_1.8-6        nlme_3.1-124     stats4_3.2.3     coda_0.18-1      mi_1.0          
[11] minqa_1.2.4      nloptr_1.0.4     Matrix_1.2-3     boot_1.3-17      splines_3.2.3   
[16] lme4_1.1-11      tools_3.2.3      abind_1.4-3
  • XQuarts は最新(2.7.8)ですか? -- 河童の屁は,河童にあらず,屁である。? 2016-03-10 (木) 15:43:58
  • 仰るとおりでした。新しいものをインストールして,使用できるようになりました。 -- sem? 2016-03-13 (日) 12:54:50

交互作用を含む重回帰分析の作図について。

初学者? (2016-02-28 (日) 17:31:37)

統計言語Rについての質問です。

y_a = a + b1*x1 + b2*x2 + b3*x1*x2 + e
y_b = a + b1*x1 + b2*x2 + b3*x1*x2 + e

重回帰分析で交互作用を検討し、上記のモデルのx2を平均値で固定した時に、
x1を動かすとyの値がどう変化するかを、信頼区間も含めて2次元の図で表したいです。
観測されたデータは100行(変数名含めず)で上50行は[class = a]で下半分[class = b]です。

[class = a](または[class = b])だけに分けて、信頼区間含めた2次元の図は書くことができるのですが、信頼区間含め[class = a]と[class = b]を一枚で収めるためのプログラミングコードがわかりません。

ggplotでもRの標準グラフィックでもどちらでも構いませんので、ご教授願います。
申し訳ありませんが、OKwebでも同様の質問しております。http://okwave.jp/qa/q9135292.html
216513.jpg
この画像は別々に画像をRから出力して、私が合成したものです。
これをRだけで作るコードををご教授願います。

  • 応用が利くよう原始的な方法を用いて基本plotで作図した -- 通りすがり? 2016-02-29 (月) 11:32:10
    data <- iris[-(51:100),]  # y: Sepal.Width, x1: Sepal.Length, x2: Petal.Length, class: Species
    model <- lm( Sepal.Width ~ Species * Sepal.Length * Petal.Length, data) # 重回帰
    agg <- aggregate(Petal.Length ~ Species, data, mean)       # classとx2代入用
    xpara <- seq(4, 8, 0.01)                                   # x1代入用
    
    a_conf <- predict(model, data.frame(Sepal.Length = xpara, Petal.Length=agg[1,2], 
      Species=agg[1,1]), interval="confidence")                # 予測値&信頼区間算出
    b_conf <- predict(model, data.frame(Sepal.Length = xpara, Petal.Length=agg[2,2], 
      Species=agg[2,1]), interval="confidence")
    
    plot(0, 0, xlim=c(4, 8), ylim=c(1.5, 5), type="n", ann=F)  # 点線版
     lines(xpara, a_conf[,1], col=2, lwd=2)
     for(i in 2:3) lines(xpara, a_conf[,i], col=2, lty=2)
     lines(xpara, b_conf[,1], col=4, lwd=2)
     for(i in 2:3) lines(xpara, b_conf[,i], col=4, lty=2)
    
    plot(0, 0, xlim=c(4, 8), ylim=c(1.5, 5), type="n", ann=F)  # 塗りつぶし版
     lines(xpara, a_conf[,1], col=2, lwd=2)       # col2 = FF0000
     lines(xpara, b_conf[,1], col=4, lwd=2)       # col4 = 0000FF
     polygon( c(xpara, rev(xpara)),  c(a_conf[,2], rev(a_conf[,3]) ),
       col="#FF000020", border=NA )
     polygon( c(xpara, rev(xpara)),  c(b_conf[,2], rev(b_conf[,3]) ),
       col="#0000FF20", border=NA )
  • 上の通りすがりさんのように、αチャンネルで半透明にして重ねるのが順当だが、グラフィックディバイス依存なので、使っているディバイスによってはαチャンネルを指定しても、半透明にならないので注意(もしかすると、最近は事情が変わっているかも知れないが)。 -- 2016-03-08 (火) 12:31:59

arimaxモデルを使用し、予測を行った際の予測モデルのサマリーについて

limlim? (2016-02-11 (木) 01:46:58)

約2年前~前日までの数値より説明変数に日本の祝日・月・曜日を加え、1ヶ月先の予測値を出すようにしましたが、予測値の算出式を知りたかったのですが、各説明変数の係数と標準誤差(s.e.)しか表示されないようです。算出式(定数項+1次前の数値×自己相関係数+ホワイトノイズ+1次前の移動平均の係数×ホワイトノイズ+・・・・)というような表示の仕方はありますでしょうか? よろしくお願いします。

xreg.train<- data.frame(
 is.holiday=jholidays.xts["::2015-11-30"],
 year=year(date.train),
 month=as.factor(month(date.train)),
 day=day(date.train),
 wd=weekdays(date.train)) %>%
 dummy.data.frame %>%
 select(-month1,-wd日曜日) %>%
 as.matrix
fit.arimax.cal<- auto.arima(call.train.ts,seasonal=T,
 trace=Txreg=xreg.train)#arimaxモデルのフィッティング

ARIMA(2,0,2) with non-zero mean : 11402.32
ARIMA(0,0,0) with non-zero mean : 11664.95
ARIMA(1,0,0) with non-zero mean : 11402.53
ARIMA(0,0,1) with non-zero mean : 11451.06
ARIMA(0,0,0) with zero mean     : 11665.87
ARIMA(1,0,2) with non-zero mean : 11401.18
ARIMA(1,0,1) with non-zero mean : 11403.75
ARIMA(1,0,3) with non-zero mean : 11401.67
ARIMA(2,0,3) with non-zero mean : 11404.22
ARIMA(1,0,2) with zero mean     : 11400.29
ARIMA(0,0,2) with zero mean     : 11417.95
ARIMA(2,0,2) with zero mean     : 11401.2
ARIMA(1,0,1) with zero mean     : 11403.12
ARIMA(1,0,3) with zero mean     : 11400.76
ARIMA(0,0,1) with zero mean     : 11450.95
ARIMA(2,0,3) with zero mean     : 11403.14
Best model: ARIMA(1,0,2) with zero mean     
summary(fit.arimax.cal) Series: call.train.ts ARIMA(1,0,2) with zero mean

Coefficients:

        ar1      ma1      ma2  is.holiday    year    month2    month3 以下略
     0.7803  -0.2321  -0.1964   -379.1346  1.5137  195.9081  272.9902  以下略
s.e. 0.0837 0.0973 0.0656 42.8611 0.0387 96.4907 99.5181 101.4300 以下略

      month11   month12      day   wd火曜日  wd金曜日  wd月曜日 以下略
     147.3163  414.5067  -1.1747  -104.1835   61.3693   22.6069 以下略
s.e. 93.0474 94.0236 1.5022 31.7203 31.6301 26.3375 32.3830 以下略

sigma^2 estimated as 59126: log likelihood=-5675.48 AIC=11398.96  以下略

Training set error measures: Training set ME -0.4521637 RMSE 243.158 以下略

以下が予測結果(抜粋)

Forecasts:
Forecast
3529.367
3404.598
3385.364
3563.843

以下が予測開始日の前日から4日前までのデータ(抜粋)

3416
3329
3001
3446

ファイルの保存による処理速度の低下について

はぶ? (2016-02-05 (金) 11:42:30)

以下のようにfor文内で文字列のベクトルをwrite()で一行ずつ上書き出力をしています。

dat <- NULL
for(j in 1:10) {
	for(i in 1:(sample(3:8,1))) dat[i] <- paste(sample(letters, sample(3:5,1)),collapse="")
	write(dat,"dat.csv",append=T,sep=",",ncolumns=length(dat))
}

実際の文字列ベクトルdatは他のデータフレームから抽出しており最大で数千要素、
添え字jのfor文のループ回数は数十万回のため処理速度を向上させたいと考えています。

ループごとにメモリからハードディスクに書き込みを行うのではなく、あらかじめ10000行×10000列で初期化したmatrixに1万ループ分程度のdatを格納し、write.table()などでまとめて保存すれば高速化できると考えたのですが、この方法は妥当でしょうか。

また、その場合は出力されるdatmatに初期化時の0が残るためファイルサイズが増えてしまいます。write()で一行ずつ出力した場合のように文字ベクトル以外はファイル中に含みたくないのですが、何か良い方歩はありますでしょうか。

宜しくお願いします。

  • あらかじめ大きな配列を用意しておくとしても,実際に格納した行数を勘定しておいて write(dat[1:n,], みたいにすればよいでしょう?
    どうやって「他のデータフレームから抽出」しているのかわからないけど,for でやらない方法もあるんじゃない?よりよい方法のアドバイスを得るためにも,もう少し実際にやっていることに近いプログラムを示す方がよいと思います。 -- 河童の屁は,河童にあらず,屁である。? 2016-02-05 (金) 11:56:10

自作関数の引数の書き出し

まるでダメ男? (2016-01-29 (金) 19:08:55)

失礼します。投稿文書の書式のリンクが無効で読み込めなく書き方がわからなかったので見にくいかもしれません。
自作関数の引数を名前にした値を名前にして返り値で自動的に書き出したいと思ったのですが、関数内にwrite.csvを使っても書き出しされません。
例えば、

kakidasi<-function(a,b) {
     何らかの処理でxを得る
return(x)
write.csv(x, paste("~/Student_dat/",substitute(a), "_", substitute(b), ". csv", sep=""), fileEncoding="Shift-JIS")
}

で処理を行っても得られるのはXだけです。フォルダに書き出しは行われていません。
何か良いアドバイスをいただけますでしょうか。

  • すみません、write.csvの部分でsが入っていませんでした。しかし相変わらず書き出しはされません。 -- まるでダメ男? 2016-01-29 (金) 19:22:11
  • return が実行された時点で関数の処理が終了するためです(http://cse.naro.affrc.go.jp/takezawa/r-tips/r/31.html)。 -- 2016-01-29 (金) 20:40:50
  • ↑の人が仰るとおりです。return と writre.csv の順序を入れ替えないとだめですね。このままでは,write.csv は実行されません(気の利いたシステムでは「write.csv は実行されませんよ」というエラーメッセージを出すこともありますが,R ではそのような対応がないのですね)
    ちなみに,どうでもいい(?)ことではあるんですが,fileEncoding="Shift-JIS" は fileEncoding="cp932" とされたほうが,今後起こりうるトラブル回避のためにはよろしいかも。
    また,
    paste("~/Student_dat/",substitute(a), "_", substitute(b), ". csv", sep="")
    では,当然ながら . と csv の間に空白がありますので,トラブルのもとになるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2016-01-29 (金) 21:02:59

エラー: 引数の長さが 0 です

まるでダメ男? (2016-01-15 (金) 18:59:21)

失礼いたします。ただいま自作の関数を作成しました。
以下の関数を動作してみたところ

if (amoji_retsu >= bmoji_retsu) { でエラー:  引数の長さが 0 です

とのメッセージが出ました。

mojiretsu_hyouka <- function(a, b, sansyo) {
	gyou_num1 <- as.integer(rownames(a)) # aの行数全て
	gyou_num2 <- as.integer(rownames(b)) # bの行数全て
	l <- expand.grid(gyou_num1, gyou_num2) # 全ての組み合わせパターン(gyou2)を起点に繰り返す
	upto <- nrow(l) # lの行数
	k <- 1
	Jaccardの類似度表 <- NA
	while (k <= upto) {
		moji_a <- as.character(a[l[k, 1], 1]) # aの文字列をlの組み合わせで順に実行していく
		moji_a_kaisuu <- as.integer(a[l[k, 1], 3])
		moji_b <- as.character(b[l[k, 2], 1]) # bも同様に
		moji_b_kaisuu <- as.integer(b[l[k, 1], 3])
		amoji_retsu <- which(colnames(sansyo) == moji_a) # moji_aがある列番号を取り出す
		bmoji_retsu <- which(colnames(sansyo) == moji_b) # moji_bがある列番号
		amoji_gyou <- which(sansyo$id == moji_a) # moji_aがある行番号を取り出す
		bmoji_gyou <- which(sansyo$id == moji_b) # moji_bがある行番号
		if (amoji_retsu >= bmoji_retsu) {
			Jaccardの値 <- sansyo[amoji_gyou, bmoji_retsu]
			h <- data.frame(paste(moji_a, moji_b, sep = "_"), moji_a,
                               moji_a_kaisuu, moji_b, moji_b_kaisuu, Jaccardの値)
			Jaccardの類似度表 <- cbind(Jaccardの類似度表, h)
		} else {
			Jaccardの値 <- sansyo[bmoji_gyou, amoji_retsu]
			h <- data.frame(paste(moji_a, moji_b, sep = "_"), moji_a, 
				moji_a_kaisuu, moji_b, moji_b_kaisuu, Jaccardの値)
			Jaccardの類似度表 <- cbind(Jaccardの類似度表, h)
		}
		k <- k + 1 # カウント
	}
	return(invisible(Jaccard係数の類似度表))
}

この関数の引数,a,b,sansyoは

> head(a)
      抽出語     品詞 出現回数
1         身    名詞C       42
2       問題 ナイ形容       41
3       なる    動詞B       39
4     つける    動詞B       38
5 リスニング     名詞       37
6     解ける     動詞       32
> mode(a)
[1] "list"~

これと同じ形の引数 b
それと3つ目の引数sansyoは

    id          基本       法則        概要       概念       特徴 原理 基礎
1 基本          NA         NA          NA         NA         NA   NA   NA
2 法則      0.024         NA          NA         NA         NA   NA   NA
3 概要     0.005   0.0000          NA         NA         NA   NA   NA
4 概念      0.040    0.030         0.0069   NA         NA   NA   NA

このような形の縦横5422のデータベースです。

> mode(sansyo)
[1] "list"~

また、そもそも引数はこのようなリスト型でも良いのでしょうか?
環境は以下のようになっています。

sessionInfo() 
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.1 (El Capitan)

では、宜しくお願いします。

  • データはリストで与えてもよいでしょうが,私はデータフレームにしました(データフレームもリストですが)
    a <- data.frame(抽出語 = c("つける", "なる", "リスニング", "解ける", 
    "身", "問題"), 品詞 = c("ナイ形容", "動詞", "動詞B", 
    "名詞", "名詞C"), 出現回数 = c("抽出語", "品詞", 
    "出現回数"))
    b <- 省略
    sansyo <- structure(list(id = structure(c(3L, 4L, 2L, 1L), .Label = c("概念", 
    "概要", "基本", "法則"), class = "factor"), 基本 = c(NA, 
    0.024, 0.005, 0.04), 法則 = c(NA, NA, 0, 0.03), 概要 = c(NA, 
    NA, NA, 0.0069), 概念 = c(NA, NA, NA, NA), 特徴 = c(NA, NA, 
    NA, NA), 原理 = c(NA, NA, NA, NA), 基礎 = c(NA, NA, NA, NA
    )), .Names = c("id", "基本", "法則", "概要", "概念", 
    "特徴", "原理", "基礎"), class = "data.frame", row.names = c("1", 
    "2", "3", "4"))
    バグを発見するには,主要な場所で,変数がどのようになっているかを print 文を挿入するなどして確認していくのがよいでしょう。
    例えば,
    amoji_retsu <- which(colnames(sansyo) == moji_a) # moji_aがある列番号を取り出す
    では,最初にこの文が実行されたあと,
    colnames(sansyo) :
    [1] "id"   "基本" "法則" "概要" "概念" "特徴" "原理" "基礎"
    moji_a = 身 
    amoji_retsu :
    integer(0)
    となります。提示されたデータでは colnames(sansyo) に moji_a が含まれないので,amoji_retu は integer(0) になっています。あなたの実際のデータでも,そのような場合があるのです。そしてその結果を使って if (amoji_retsu >= bmoji_retsu) のような,比較をすることができない(引数の長さが 0 です)ということになります。そのような場合にはどのように処理するかというプログラム部分を追加しないといけませんね。
    なお,プログラムを見るときに,綺麗に書かれていないと非常に見にくく,バグを発見することも難しくなります。丁寧に書きましょう。質問自体,書き直しておきます。 -- 河童の屁は,河童にあらず,屁である。? 2016-01-15 (金) 19:17:55
  • 河童の屁は,河童にあらず,屁である。様 どうもご丁寧にありがとうございます。sansyoの部分にmoji_aが含まれていないようですね。とても助かりました。今から手直しをしてみようと思います。プログラムの書き直しもありがとうございました。では、失礼します。 -- まるでダメ男? 2016-01-15 (金) 19:49:32

エラー: Unknown parameters: familyと表示されグラフが出力できません。

初学者? (2016-01-10 (日) 15:18:37)

library(MASS)
b <- biopsy
b$classn[b$class==“benign”] <- 0
b$classn[b$class==“malignant”] <- 1

ggplot(b, aes(x=V1, y=classn)) + geom_point() + geom_smooth(method = glm, family = binomial)

 エラー: Unknown parameters: family

上記のようにRグラフィッククックブックのコードに従って、グラフを出力しようとしたところ、エラーが表示されてしまいグラフをを出力できません。このエラーの解決方法をご教授願います。

  • ggplot なんか使わないんだけど,geom_smooth のオンラインヘルプの中の例「## Not run: 」と書かれている部分の例を見ると,geom_smooth は,geom_smooth(method = "glm", method.args = list(family = "binomial")) って書かないといけないんじゃ?そのようにすると一応,エラーメッセージ無く,それらしい図が描かれるけど? -- 河童の屁は,河童にあらず,屁である。? 2016-01-10 (日) 17:53:50
  • method.args = list(family = "binomial"))で書くと問題なく、グラフが出力されました。ありがとうございます。 -- 初学者? 2016-01-10 (日) 18:35:37

連続変数データにおけるlocalprob の解釈について

わっと? (2016-01-08 (金) 18:14:05)

ベイジアンネットワークのパッケージ deal において、localprob というコマンドを実行すると、作成したベイジアンネットワークモデルに対して、離散型のデータの場合は変数間の条件付確率が返されて、連続型のデータの場合は回帰係数が返されるらしいのですが、その回帰係数の解釈がよくわかりません。

分析に使ったデータは、2014年のプロ野球のデータ(一部はゲーム内における選手の能力値)で、変数は能力値であるミート、パワー、走力、肩力、守備力、捕球の6つと、選手の年俸、身長、体重、年齢、本塁打数、安打数、三振数、盗塁数、失策数が9つの合計15の連続変数を用いて分析をしました。

肩力についての回帰係数を見てみると、

$肩力
         [,1]     [,2]       [,3]
[1,] 63.25038 57.33878 0.07894247

しかし、作成したベイジアンネットワークモデルにおいての有向辺が引かれているのは、7列目の変数の守備力から、6列目の肩力に対してだけです。
すると、回帰係数は1つだけ表示されると思うのですが、なぜ3つ出力されているのでしょうか?

また、表示された回帰係数はどのように解釈すればよいのでしょうか?

  • 「肩力」って,どんな風な値を取る変数ですか?例えば,「弱い」〜「強い」の4段階を表すカテゴリーでは?deal, localprob は知らないし知りたくもないけど,base の lm と同じように扱われるなら,最初のカテゴリーをベース(0)として,2番目以降のカテゴリーに対する回帰係数では?示された回帰係数の増減傾向を見ると,この関数では「一番最後のカテゴリーをベースとする」ということになっているのかな。オンラインヘルプで localprob についての説明をよくお読みになることをお勧めします(ネットでの localprob の検索もお忘れなく)
    いま,ちょっと見たところでは,
    http://d.hatena.ne.jp/araili/20100603/1275547994
    の例にあるように,ベースの設定はせずに,各カテゴリーへの回帰係数が表示されるのかな?つまり,あなたの「肩力」が3カテゴリーならそういうこと。4カテゴリーなら「最後のカテゴリーがベースになっている」
    いずれにせよ,ある分析法を採用したら,「解釈がよくわかりません」なんていうのは論外!!ということ。自分で責任もって調べなさい。というか,そういうことは事前にクリアしてから分析方法を選択し,分析すべきこと。「恥ずかしい」ことですよ。 -- 河童の屁は,河童にあらず,屁である。? 2016-01-08 (金) 21:08:03
  • 回答ありがとうございます。肩力などの能力値は、1~100までの値をとります。 もう少し自分で調べてみて、それでも分からなければまた質問させていただこうと思います。失礼いたしました。 -- わっと? 2016-01-08 (金) 22:45:54

変数変換の方法について

(2016-01-03 (日) 01:45:45)

前提:下記二種類のデータフレームA,Bがあるとします。

A.変数xを保持するデータフレーム

x
0.0
0.1
...
9.9

※0.0-9.9は例であり実際は色々なる値を取ります。

B.変数xの区間と変換方法(切片と傾き)を保持するデータフレーム

start end intercept coefficient
0.0 0.3 5.0 1.0
0.3 0.9 4.7 2.0
1.5 2.0 3.0 4.0
...

※上記の区間は重なり合うことはありませんが、歯抜けになることがあります。
※レコード数は固定ではなく可変です。

やりたいこと:
1.データフレームBに基づきデータフレームAの変数xに変換処理をする。
具体的には変数xがデータフレームBのstart-endに該当すれば

intercept+coefficient*x

に変換する。

2.データフレームBのstart-endに該当しない区間がデータフレームAの変数xに存在する場合、線形補完して変換する。
上記データフレームBの場合、区間0.9-1.5が存在しないので

start end intercept coefficient
0.3 0.9 4.7 2.0
1.5 2.0 3.0 4.0

の両端を結んだ直線で変換処理を行う。

  • 「一行でできる!」なんてうまい方法はないので,地道にプログラムすればよいだけ。うまく書こうとせず,わかりやすく?書いたプログラムを以下に。 -- 河童の屁は,河童にあらず,屁である。? 2016-01-03 (日) 10:36:21
    a <- data.frame(x=seq(0, 2.2, by=0.1))
    b <- data.frame(start=c(0.0, 0.3, 1.5), end=c(0.3, 0.9, 2.0),
                    intercept=c(5.0, 4.7, 3.0), coefficient=c(1.0, 2.0, 4.0))
    y <- data.frame(t(apply(b, 1, function(z) z[3]+z[1:2]*z[4]))) # 各区間の両端での y 座標
    b3 <- b[1,] # 歯抜けの区間を補間する(区間での intercept と coefficient を求める)
    for (i in 2:nrow(b)) { # i = 3 のとき
    	if (b$start[i] != b$end[i-1]) { # b$start[3] = 1.5, b$end[2] = 0.9
    		x.s <- b$end[i-1] # 0.9
    		y.s <- y$end[i-1] # 6.5 
    		x.e <- b$start[i] # 1.5
    		y.e <- y$start[i] # 9.0
    		Coefficient <- (y.e-y.s)/(x.e-x.s) # (9.0-6.5)/(1.5-0.9) = 4.16667
    		Intercept <- y.s-x.s*Coefficient # 6.5-0.9*4.16667 = 2.75
    		b3 <- rbind(b3, c(x.s, x.e, Intercept, Coefficient))
    	}
    	b3 <- rbind(b3, b[i, ])
    }
    n = length(a$x)
    y = numeric(n)
    for (i in seq_along(y)) { # 該当区間での変換結果 y を求める
    	x = a$x[i]
    	j <- which(b3$start <= x & x <= b3$end)
    	if (length(j)) {
    		y[i] <- b3$intercept[j[1]]+x*b3$coefficient[j[1]]
    	} else {
    		y[i] <- NA
    	}
    }
    y
  • わかりやすいプログラムありがとうございます。 -- 2016-01-03 (日) 22:09:05

RExcel のインストールが上手くいかない

初心者R? (2015-12-30 (水) 20:38:31)

データ解析にRを利用したくRExcelの導入を試みました。
R-3.2.3とstatconnDCOMをインストール後、R上でrscproxyのパッケージをインストールし、
rcomをダウンロードすると
警告メッセージ:
package `rcom` is not available
と表示されます。

またrcomを無視してRExcellnst3.2.15をインストールして起動してみましたが、
No R server configuredと表示されて、起動できませんでした。

RAndFriends?は消えてしまったようで、RExcelのダウンロード手順も検索しても新しい物が見当たらず困っております。
(R, Excelは管理者権限で実行しています)

  • > rcomを無視してRExcellnst3.2.15をインストール
    無視って...そんな...ひどい...
    何十回も何百回もやるんじゃないのなら,Excel で csv ファイルで保存して,R で処理すればよいと思います --  ? 2015-12-30 (水) 21:17:11
  • 申し訳ないです。無視というよりは、見当たらなかったので、無い状態でも出来ないか試したという感じです。かなりの回数データの移動を行なうので、RExcelを利用したいのです。 -- 初心者R?? 2015-12-31 (木) 13:39:56
  • RExcelにこだわらず,readxlパッケージでも使ってみたらいかがでしょうか? -- ふしぎ? 2015-12-31 (木) 14:43:03
  • 私はどれをお勧めと言うことはできないですが,奥村先生のページ「RでExcelのデータを読む方法」
    https://oku.edu.mie-u.ac.jp/~okumura/stat/exceldata.html
    を参考になされば? -- 河童の屁は,河童にあらず,屁である。? 2015-12-31 (木) 15:22:13
  • 皆さま、ありがとうございます!教えていただいたほかの方法を試してみます! -- 初心者R? 2016-01-01 (金) 19:16:14

パッケージをインストールはできるが、パッケージの読み込みに追加されない

わっと? (2015-12-25 (金) 21:05:53)

初投稿です。
Rパッケージを最新版に更新したら、どうやらパッケージが初期化されてしまったみたいで、もう一度インストールをしようとしました。

パッケージ ‘deal’ は無事に展開され、MD5 サムもチェックされました 
警告:   一時的なインストール ‘C:\Users\wataru\Documents\R\win-library\3.2\file12c02e8d32da\deal’ を ‘C:\Users\wataru\Documents\R\win-library\3.2\deal’ へ移動できませんでした 

ダウンロードされたパッケージは、以下にあります 
       C:\Users\wataru\AppData\Local\Temp\Rtmp4O0dGX\downloaded_packages 
警告メッセージ: 
download.file(url, destfile, method, mode = "wb", ...) で: 
  ダウンロードされた長さ 189305 != の報告された長さ 200 です 

このように、パッケージdealをダウンロードすることはできたのですが、パッケージの読み込みのところを見ても、dealが追加されていません。どうすればよいのでしょうか?
ちなみに、Rを初めてインストールしたのは去年の五月で、今回初めて更新しました。使用OSはwindows10です。

  • よく知らないのだけど,R 自体がなんか変なところにインストールされているようで(C:\Users\wataru\Documents\R 以下か?)ちょっとやり直した方がいいのかな? --  ? 2015-12-25 (金) 22:02:38
  • ただの警告メッセージ(ただのバグ)ですから無視して, library("deal") を行ってください. M$上では通常R_LIBSに書き込み権限が無いので,通常ならばR_LIBS_USERにインストールすることになるので,ドキュメントの配下にプログラムがインストールされる仕様になっています.rw-FAQ 4.2 -- 2015-12-26 (土) 20:14:00

連番の変数の使用

(2015-12-22 (火) 01:37:05)

連番の変数をassign()を使用して、それぞれにcsvを読み込みました
read.csv以下:datayardはcsvのあるフォルダ名が代入
file.nameはcsvの名前の共通部分
sort_listに各csvの異なる数字が格納されています。

for(j in 1:nrow(sort_list)) {
  assign(paste("data", j, sep=""), read.csv(paste(datayard, file.name, sort_list[j, ], ".csv", sep=""), header=T))}

これによってdata1,data2という変数に異なるcsvを読み込みました。
ここからが困っているところなのですが、
各data1,data2の同じ列のデータだけ取り出して一つの変数に代入したいのですが、dataの数が少ないときは

> data <- cbind(data1[, 1], data2[, 1])

という風にやれば望む形になるのですが、すべての列についてやりたいのと、data1~100を超えるので、ループで変数も連番でまとめたいのですが
イメージでは

for(i in 1:100) {
  data <- cbind(data, datai[, 1])
}

という風にやりたいのですが、どうやったらいいのでしょうか?

  • 違う物を違う名前に読み込むというのは,自然のように見えるが,プログラム的には非常にマズイ方法。アクセスするときに,個別の名前を列挙しないといけなくなるのだから。また,後で使う必要がないなら,別々の変数に読み込む必要すらない。
    以下のようにすれば,何の問題もない。できあがるものも,一つのデータフレームなので列ごとに分解する必要もなく,d[,1], d[,i] のようにアクセスも普通にできる。別の変数に代入したいならすればよい。
    以下のような形式の csv ファイルがある test1.csv, test2.csv, test6.csv, test9.csv,...
    あなたの場合なら,sort_list <- c(1, 2, 6, 9,...) となっている(欠番が無ければすこし簡単)。
    test1.csv 5 行のデータ
    "a","b","rnorm"
    1,"a",-0.252631231784056
    2,"b",0.650075900149871
    3,"c",-0.639124667772796
    4,"d",1.57159006714947
    5,"e",-1.10845059755105
    このようなデータを読み込んで,一つのデータフレームに連結(rbind)してゆく
    datayard <- "~/R/"
    file.name <- "test"
    sort_list <- c(1, 2, 6, 9)
    d <- NULL
    for (j in sort_list) {
       temp <- read.csv(paste0(datayard, file.name, j,".csv"))
       d <- rbind(d, temp)
    }
    d を表示すると
        a b       rnorm
    1   1 a -0.25263123
    2   2 b  0.65007590
    3   3 c -0.63912467
    4   4 d  1.57159007
    5   5 e -1.10845060
    6   6 f -1.01847370
      :
    19 19 s  1.88522585
    20 20 t  0.84095473
    というようになっていることが確認出来ますね。
    そのほかに,あとで個々のデータフレームも使いたいというなら,それぞれをリスト要素に読み込んでいって,Reduce で結合するという手もあります。
    d <- vector("list")
    for (j in sort_list) {
      d[[j]] <- read.csv(paste0(datayard, file.name, j,".csv"))
    }
    d2 <- Reduce(rbind, d)
    要するに,for ループや,*apply 関数で扱いやすいようにプログラムするのです。 -- 河童の屁は,河童にあらず,屁である。? 2015-12-22 (火) 06:49:15
  • 古典的な方法としては, do.call で引数展開するのが良いように思います. do.call("cbind",lapply(paste("data", 1:nrow(sort_list), sep=""),function(x)get(x)[,1])) -- ワンライナー? 2015-12-22 (火) 12:38:16

グラフの描画法

名無しさん? (2015-12-20 (日) 19:14:49)

rで最小0、最大100の範囲で整数の一様乱数を1万個発生させ、その群をaとしました。table(a)でどの値が何個出てきたのかを調べるまではできたのですが、それをグラフにするやり方が分かりません。グラフについて詳しく言うと、横軸が整数値(0~100)、縦軸が発現回数で線は曲線にしたいです。どのようなコマンドを入力すればよいのでしょうか。

  • 第1に,投稿先が不適切だったので,ここへ移しました。第2に,「線は曲線に」って,この場合は折れ線にしかならないですけど。度数多角形を描きたいということなんでしょうか?
    plot 関数でよいのですが,第二引数に table 関数の戻り値をそのまま描くと変なことになるので c 関数を使うのがポイントでしょう(c 関数でなくてもよいけど)。 -- 河童の屁は,河童にあらず,屁である。? 2015-12-20 (日) 19:24:21
    a <- sample(0:100, 10000, replace = TRUE)
    b <- table(a)
    plot(0:100, c(b), type = "l", ylim = range(b),
         ylab = "発現回数", xlab = "X")
    freq.png

データ数の異なる二元配置の分散分析の結果について

tao? (2015-12-15 (火) 18:16:40)

初等的な質問で申し訳ございません。 以下のようなデータで

> test
   A B     C
1  1 1  8118
2  1 1  1785
3  1 1  2122
4  1 2  9448
5  1 2  8237
6  1 2 17868
7  1 2 33593
8  1 2     0
9  2 1 14015
10 2 1   632
11 2 2   947
12 2 2   330
13 2 2  5444
14 2 2  4140
15 3 1  2419
16 3 2   396
17 3 2  7809
18 4 1  2657
19 4 2   362
20 4 2     0
21 5 1   412
22 5 1  6637
23 5 2  2269
24 5 2  3873
25 5 2  2376
26 5 2 10303

test<-read.csv(file="test7.csv",header=TRUE)
summary ( aov (C~A*B, data=test) )
summary ( aov (C~B*A, data=test ) )

というコマンドを実行すると

> summary ( aov (C~A*B, data=test) )
            Df    Sum Sq   Mean Sq F value Pr(>F)
A            1 1.392e+08 139199274   2.676  0.116
B            1 2.728e+07  27281060   0.524  0.477
A:B          1 4.053e+07  40530623   0.779  0.387
Residuals   22 1.144e+09  52017772               
> summary ( aov (C~B*A, data=test ) )
            Df    Sum Sq   Mean Sq F value Pr(>F)
B            1 2.369e+07  23693485   0.455  0.507
A            1 1.428e+08 142786849   2.745  0.112
B:A          1 4.053e+07  40530623   0.779  0.387
Residuals   22 1.144e+09  52017772               

という結果がでてきて、交互作用については、一致するのですが、主効果の結果が違ってしまいます。
データセットの並べ方を変えてBの項目を先に並べても同じ結果となってしまいます。
これは何がいけないのでしょうか。
何か、ご存じの方がいらっしゃいましたら、お教え頂ければ幸いです。

  • 要因が直交していない場合には,aov では Type I の平方和を用いるのでどちらを先にするかで結果が変わります。car パッケージの Anova 関数では Type II,Type III が使えます。Type II の平方和(SS)によれば,A*B でも B*A も,どちらも同じになります(Type II がデフォルトなので指定しなくてもよい)。 -- 河童の屁は,河童にあらず,屁である。? 2015-12-15 (火) 19:08:53
    > library(car)
    > Anova(aov (C~A*B, data=test ), type="II")
    Anova Table (Type II tests)
    
    Response: C
                  Sum Sq Df F value Pr(>F)
    A          142786849  1  2.7450 0.1118
    B           27281060  1  0.5245 0.4766
    A:B         40530623  1  0.7792 0.3869
    Residuals 1144390976 22               
    
    > Anova(aov (C~B*A, data=test ), type="II")
    Anova Table (Type II tests)
    
    Response: C
                  Sum Sq Df F value Pr(>F)
    B           27281060  1  0.5245 0.4766
    A          142786849  1  2.7450 0.1118
    B:A         40530623  1  0.7792 0.3869
    Residuals 1144390976 22
  • 貴重なご指摘ありがとうございます。自分の勉強不足を恥じ入ります。本当にありがとうございました。 -- tao? 2015-12-16 (水) 11:21:33

コピペでpar()を入れるとエラー

R初心者? (2015-12-08 (火) 21:08:40)

Mac OSX上でRを動かしています。
棒グラフを書く際に、余白の調節をしようとpar(mar=)をコマンドに加えたいと考えています。
しかし、実際にやってみると

par(mar = c(10,3,2,2))                     

エラー:  想定外の入力です  in "par(mar = c(10,3,2,2))


このようなエラーが出るため余白の調節がされないままにグラフが出力されてしまいます。
一方で、データの取り込みからグラフの出力までをコピペで一気にせず、
グラフの取り込み→par(mar=)→barplot()とすると上手くいきます。
この理由が何なのか、また一度のコピペで綺麗に出力する方法があるのか知りたいです。
周りにRを使っている人がおらず、自分で調べてもよくわかりませんでした。
やはり、Mac上で動かしていることが原因なのでしょうか。

何かご存知の方がいらっしゃいましたら、知識を分けていただけると幸いです。
よろしくお願い致します。

  • よくわかりませんが,以下のようなものをコピー・ペーストしてもエラーが出るのですか?
    tbl <- table(iris$Species)
    par(mar = c(10,3,2,2))
    barplot(tbl)
    この入力ではエラーが出ないなら,あなたがやった一部始終をこぴぺしてみれば?
    > やはり、Mac上で動かしていることが原因なのでしょうか。
    なんで,そんな無関係なことを言う必要があるのか?被害妄想,風評被害,少数者迫害意識。
    本当にそう思うなら,Windows にすればよいだけ。大衆迎合,烏合の衆,強いものには巻かれる,安定志向,寄らば大樹の陰。 -- 河童の屁は,河童にあらず,屁である。? 2015-12-08 (火) 21:51:27
  • 返信ありがとうございます。指示いただいたものについては正確に表示されました。 -- 初心者? 2015-12-09 (水) 09:06:02
    data <- read.table("サンプル",header = T, row.name = 1, sep = ",")      #dataの取り込み
    data <- as.matrix(data) # matrixへの変換
    data <- t(data) # 行列の入れ替え
    data.mean <- apply(data, 2, mean, na.rm =T) # グラフの平均値(グラフの高さの算出)
    data.sd <- apply(data, 2, sd, na.rm = T) # 誤差範囲
    par(mar = c(10,3,2,2)) #余白の計算
    data.graph <- barplot(data.mean, main =  "名前 ",
                  ylim = c(0,max(data.mean+data.sd)*1.1),
                  ylab = "Relative gene expression level",
                  col = c("1","8","1","8","1","8","4","2"), 
                  font.axis = 15, cex.lab = 1.2, cex.axis = 1.2, las = 2) #グラフの作図
    arrows(data.graph, data.mean - data.sd, data.graph,
           data.mean + data.sd, angle = 90, length = 0.1) # 正のエラーバー作図
    arrows(data.graph, data.mean + data.sd, data.graph,
           data.mean - data.sd, angle = 90, length = 0.1) # 負のエラーバー作図
  • 本掲示板でプログラムを提示するときの規則を確認してください。直しましたが,エラーの本質部分は残してあります。
    par( ) の行の最後の括弧から,全角空白が複数個あり,# も全角です。そのため,par が正しく解釈されていないのです。 -- 河童の屁は,河童にあらず,屁である。? 2015-12-09 (水) 10:39:05
  • 申し訳ございません、本掲示板も最近知った者で、これからは気をつけます。半角に直しましたところうまくいきました。ありがとうございます! -- 初心者? 2015-12-09 (水) 11:33:12

回帰分析(型 (NULL) は変数 'x1' に対しては不正です )

初心者? (2015-11-28 (土) 11:31:03)

model.frame.default(formula = y ~ x1 + x2  でエラー: 
   型 (NULL) は変数 'x1' に対しては不正です 

重回帰分析を実行すると、上記のエラーメッセージが表記されます。
エクセルでデータセット(csv形式、21行4列)を作成しました。
1行目は変数名です。また、1列目〜4列目までは

id:Factor
y:int
x1:int
x2:int

という型式です。

> data<-read.csv("sample.csv",header=TRUE)
>lm(y~x1+x2, data=data)

model.frame.default(formula = y ~ x1 + x2  でエラー: 
   型 (NULL) は変数 'x1' に対しては不正です 

このようなエラーが発生してしまう原因をお教えいただければ幸いです。
よろしくお願いします。

  • > 1列目〜4列目までは ... という型式です。
    というのは,str(data) で確かめたということですか?
    21 行のデータなら,ここへそのデータをアップしてみれば?というか,data をプリントアウトしておかしなことはみあたりませんか? -- 河童の屁は,河童にあらず,屁である。? 2015-11-28 (土) 21:41:02
  • 返信ありがとうございます。str(data)でチェックしました。プリントアウトしてもおかしな点はなかったです。Rではできなかったのですが、Rstdioでは実行できました。 -- 初心者? 2015-11-29 (日) 14:06:35
  • > Rではできなかったのですが、Rstdioでは実行できました
    不思議ですねえ。 -- 河童の屁は,河童にあらず,屁である。? 2015-11-29 (日) 21:38:33

重回帰分析における as.factor() の出力結果についての質問

まつ? (2015-11-26 (木) 16:46:40)

申し訳ありません R 使いたての初心者です

単純な重回帰分析で実験ケースごとのカテゴリー変数を投入したいと考えています。

result<-lm(dependent~ hoge + as.factor(sortcase))
summry(result)

と記述しました。これを実行してみると

                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)            0.1213389  0.0039691  30.571  < 2e-16 ***
hoge                   0.0300854  0.0080421   3.741 0.000184 ***
as.factor(sortcase)2   0.2413299  0.0074716  32.300  < 2e-16 ***
as.factor(sortcase)3  -0.0124357  0.0080555  -1.544   0.122657    
as.factor(sortcase)4  -0.1181738  0.0089075 -13.267  < 2e-16 ***

と結果が返されます。
as.factor(sortcase)1 が推定されないのはなぜですか?
Intercept と同じだからでしょうか

教えて貰えれば幸いです

  • この場合(カテゴリー変数が 1 個の場合)は,intercept に当たります。複数の Factor 変数を使うと分かりますが,1番目のカテゴリーはベースラインとされているからです。(Estimate が 0)。つまり,1番目のカテゴリーの係数を 0 としたときに,2 番目のカテゴリーの係数はそれより 0.2413299 大きく,3 番目のカテゴリーの係数はそれより -0.0124357 小さい...などということを表しているんです。
    なお,数学的にいえば,1番目のカテゴリーも含めると正規方程式が解けない(ランク落ちする)ので,どれか 1 つのカテゴリーをモデル式から消去する必要があるということです(何番目のカテゴリーを消去しても結果は同じ)。-- 河童の屁は,河童にあらず,屁である。? 2015-11-26 (木) 18:27:18
  • なるほど、非常にわかりやすい説明ありがとうございました。Rの大学教科書にも乗っておらず、調べた英語サイトも「 Intercept だ」という一言だけで理屈でどういう仕組なのか分からず困っていたとこでした。本当にありがとうございました。 -- まつ? 2015-11-26 (木) 20:24:09

複数の01データの分布を一覧するには?

たけ? (2015-11-25 (水) 09:39:01)


お世話になります。01データ、あるいは数カテゴリのみのカテゴリカルデータ同士の分布と関係性を容易に一覧する方法をご存じでしたらお教えいただければ幸いです?
連続変数であれば相関係数行列cor(x)やplot(x)とすれば分布と関係性を大まかに一覧できますが、01データの場合、距離行列dist(x)と共起ネットワーク図plot(network(x))くらいしかないでしょうか?


行列の見出しと行数で数字を抽出

Rに困った? (2015-11-18 (水) 17:01:20)

a=matrix(c(4,3,3,4,2,2,4,1,1),3,3)

とし,

  |4 3 3|
a=|4 2 2|
  |4 1 1|

のように行列を作成後,

colnames(a)=("A","B","C")

とし,

   A B C
  |4 3 3|
a=|4 2 2|
  |4 1 1|

とします.
ここから,C列(3,2,1)の[要素]情報を使って
aの配列にアクセス:
a[1,]の3列目,
a[2,]の2列目,
a[3,]の3列目
すなわち,c(3,2,4)を取り出したいのですが,
どなたかよい方法をご教授いただけないでしょうか?

  • 「Aの1行目は何になるか?のように,それぞれ調べる方法」?列を列名で指定したいということですか?
    a[1,"A"] とか a[2,"B"] とかすればよいだけですよ。
    どうしても,「Aの1行目は何になるか?」のように順序にこだわるならば,a[,"A"][1] としてもよいですが,冗長ですよね。
    なお,例示されたように a を作るならば,a=matrix(c(4,3,3,4,2,2,4,1,1),3,3, byrow=TRUE) としなければならないし,colnames の右辺は c("A","B","C") でなければならないというのは,うっかりミスということで済むでしょうが,投稿記事を私が直したので,今は背景が薄水色で表示されている部分のようにするためには,どのように記事を作成すればよいかは,自分で調べて今後はそれにしたがってください。 -- 河童の屁は,河童にあらず,屁である。? 2015-11-18 (水) 17:12:03
  • かってに,質問を書き換えてくれると,私がとんちんかんなことをいっていることになるんだが??
    この上の回答は,
     A列の1行目は4,B列の2行目は2,C列の3行目は1となると思います.
     Aの1行目は何になるか?のように,それぞれ調べる方法はありますでしょうか?
     お手数ですが,どなたかご回答宜しくお願い致します.
    だったので,それに答えた。
    書き換えられた質問と回答の例示が合わない。ちゃんと質問しないと相手にしてもらえなくなりますよ。
    「a[3,]の3列目」ではなくて,「a[3,]の1列目」なんでしょう?そもそも,「A列の1行目」とか,「a[3,]の1列目」といういいかた自体が変なんだけど。
    そうだと仮定して,
    > a[cbind(1:3,a[,3])]
    [1] 3 2 4
    でしょう? -- 河童の屁は,河童にあらず,屁である。? 2015-11-18 (水) 17:30:37
  • 大変申し訳ありません.RjpWiKi?初心者のため,操作を誤ってしまいました.以後気をつけたいと思います. -- Rに困った? 2015-11-18 (水) 17:41:36

heatmap図のlegendの描写位置について

かがみ? (2015-11-16 (月) 16:52:13)

お世話になります。

data(iris)
heatmap(as.matrix(iris[,1:4]))
legend("topleft", colnames(iris)[1:4])

legendの枠を左上の余白に作成して図に被らないようにしたいのですが、どのようにすればよいでしょうか。おそらくheatmap図の左上の領域は余白になっているために、legendを描けないようなのです。

環境はWindows7、R3.1.2です。

お手数ですが、どなたかご回答宜しくお願いします。

  • legend 関数を,legend(-0.14, 1.15, colnames(iris)[1:4], xpd=TRUE) のようにしてみてください。最初の2つの数値が,legend box の左上隅の座標です。試行錯誤でやるよりは,一度図を描いて,コンソールへ locator(1) とか入力した後,グラフィックウインドウへ移って,一度クリックした後,カーソルが "+" になってから,希望の位置へカーソルを動かしてから,クリックする。コンソールに数値が2つ表示されるでしょう。(要するに,locator 関数を使えば?ということです)
    xpd=TRUE を忘れないこと。 -- 河童の屁は,河童にあらず,屁である。? 2015-11-16 (月) 18:09:07
  • 目的の処理ができました。ありがとうございました。locator()ではなく legend(par("usr")[1],par("usr")[4] ・・・)としてもよさそうですね。 -- かがみ? 2015-11-16 (月) 19:22:41

RHmm

さくら? (2015-11-14 (土) 15:23:35)

RHmm という隠れマルコフ解析用パッケージをダウンロードしたいのですが
見つかりません。
どこにあるか教えてもらえないでしょうか。

  • 検索さえしなかったのですか。http://qiita.com/ru_pe129/items/1e3bed84cbda4ae603fc でもみれば? -- 河童の屁は,河童の屁は,河童にあらず,屁である。? 2015-11-14 (土) 16:28:52
  • 河童さんありがとうございます.ダウンロードまでできました.次のような指示がありましたがうまくインストールできません。「Rを開いて、 install.packages("ダウンロードしたtar.gzファイルのパス", repos = NULL, type = "source") これでRHmmを使えます。」しかし,"ダウンロードしたtar.gzファイルのパス"のところに入れる語句がわかりません.よろしくお願いします。 -- さくら? 2015-11-14 (土) 17:06:49
  • 文字通りのことですが。
    "ダウンロードしたtar.gzファイル" のある場所ということです。それがわからないなら,使うのはあきらめましょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-11-14 (土) 21:10:21

nomogram

TTT? (2015-11-04 (水) 22:05:07)

非常に初歩的で申し訳ありません。
とある疾患について、Nomogramを作成したいのですが(論文でよくRがひっかっかてきます。)、EZ-Rでどのように操作すれば良いのかわかりません。(あくまで操作の問題です・・・)

何か参考に出来る書籍等ご存知の方はいらっしゃいませんでしょうか?

  • EZ-R で一発でできないものは,初歩的なものではないでしょう。あきらめた方がしあわせかも。 -- 河童の屁は,河童にあらず,屁である。? 2015-11-04 (水) 22:37:25
  • やはり,EZ-R では一発で出来ないようで,どなたからもお返事がないようなので,プログラムを書いてみました。 -- 河童の屁は,河童にあらず,屁である。? 2015-11-06 (金) 15:46:49
    # ロジスティック回帰分析の結果からノモグラム作成
    nomogram <- function(name, b, value, b0, factor = 10) {
        scale <- function(title, y.pos, min.x, max.x, label) {
            scale0 <- function(min.x, max.x, tick, delta, label) {
                x.pos <- seq(min.x, max.x, by = tick)
                if (is.null(label)) label = x.pos
                segments(x.pos, y.pos, x.pos, y.pos + delta * h, xpd = TRUE)
                if (tick == 10) {
                    text(x.pos, y.pos + 0.5 * h, label, pos = 3, xpd = TRUE)
                }
            }
            text(0, y.pos + 0.5, title)
            segments(min.x, y.pos, max.x, y.pos, xpd = TRUE)
            scale0(min.x, max.x, 1, 0.5, NULL)
            scale0(min.x, max.x, 5, 0.8, NULL)
            scale0(min.x, max.x, 10, 1, label)
        }
    
        b <- factor * b
        b0 <- factor * b0
        m <- length(name)
        d <- expand.grid(lapply(value, as.integer))
        point <- t(t(d) * b)
        r <- pretty(apply(point, 2, range))
        min.x <- min(r)
        max.x <- max(r)
        plot(c(min.x, max.x + 10), range(0:(m + 4)), type = "n", bty = "n",
             xaxt = "n", yaxt = "n", xlab = "", ylab = "")
        h <- strheight("H")
    
        m3 <- 0.5 * m + 3
        text(0, m3 + 0.5, "リスク")
        lp <- (c(min.x, max.x) + b0)/factor
        P <- pretty(1/(1 + exp(-lp)))
        p <- c(0.01, 0.05, seq(0.1, 0.9, by = 0.1), 0.95, 0.99)
        lp <- -log((1 - p)/p)
        pos.x <- lp * factor - b0
        segments(min(pos.x), m3, max(pos.x), m3, xpd = TRUE)
        segments(pos.x, m3, pos.x, m3 + h, xpd = TRUE)
        text(pos.x, m3 + 0.5 * h, p, pos = 3, xpd = TRUE)
    
        lp <- pretty((c(min.x, max.x) + b0)/factor)
        lp <- seq(min(lp), max(lp), by = 1)
        min.pt <- factor * min(lp) - b0
        max.pt <- factor * max(lp) - b0
        scale("リニア・プレディクタ", 0.5 * m + 2, min.pt, max.pt, lp)
    
        scale("ポイント", 0.5 * m + 1, min.x, max.x, NULL)
    
        for (i in 1:m) {
            v <- value[[i]]
            l <- length(v)
            if (l > 5) {
                v <- pretty(v)
                l <- length(v)
            }
            col <- (b[i] < 0) + 1
            x <- v * b[i]
            pos.y <- i * 0.5
            segments(x[1], pos.y, x[l], pos.y, col = col)
            segments(x, pos.y, x, pos.y + h, col = col)
            text(x, pos.y + 0.5 * h, v, pos = 3, col = col)
            text(x[1], pos.y, name[i], pos = ifelse(col == 1, 2, 4))
        }
        r <- range(lp)
    }
    # 使用例(グラフィックウインドウの大きさを調整して何回か描画してください)
    lp <- nomogram(name = c("属性変数", "属性変数2", "連続変数"), # 変数名
           b = c(2.21, 1.34, -0.18), # 係数
           value = list(c(0, 1, 2, 3), c(0, 1), 10:30), # 変数の取る値
           b0 = -1.53) # 定数項
    nomogram.png
  • ご丁寧にありがとうございます。一度やってみます。 -- TTT? 2015-11-10 (火) 09:34:49

行列の操作(0/1の反転、値の置換)

通りすがり? (2015-10-30 (金) 15:51:34)

行列の操作について質問です。

(質問1)
0または1を要素として持つM×N行列に対し
全ての要素を反転する(0を1、1を0に変換する)方法はありますでしょうか?

(質問2)
実数値を要素として持つM×N行列に対し
指定した列の値を指定した値(例えば0に置き換え)に
全て置換する方法はありますでしょうか?

  • ぶさいくなコードですが、目的は達せられますよ。 -- markovchainmontecarlo? 2015-10-30 (金) 17:27:19
    >(質問1)
    > set.seed(0)
    > (mat <- matrix(sample(0:1, 20, TRUE), 4, 5))
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    1    1    0    0
    [2,]    0    0    1    1    1
    [3,]    0    1    0    0    1
    [4,]    1    1    0    1    0
    > apply(mat, c(1, 2), function(x) ifelse(x==0, 1, 0))
         [,1] [,2] [,3] [,4] [,5]
    [1,]    0    0    0    1    1
    [2,]    1    1    0    0    0
    [3,]    1    0    1    1    0
    [4,]    0    0    1    0    1
    >(質問2)
    > mat[,3] <- 99
    > mat
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    1   99    0    0
    [2,]    0    0   99    1    1
    [3,]    0    1   99    0    1
    [4,]    1    1   99    1    0
  • (質問1)は, x <- 1-mat だけでできる。 -- 河童の屁は,河童にあらず,屁である。? 2015-10-30 (金) 17:56:55
  • おおー。 -- markovchainmontecarlo? 2015-10-31 (土) 00:56:01
    さすが、河童の屁は,河童にあらず,屁である。さんですね。非常にスマート。

複数の列に対するソート

? (2015-10-21 (水) 14:48:54)

お世話になります。

以下のようなデータフレームxに対して、まずcat列で昇順にソートし、次にname列で降順にソートしたいのですが、どのようにすればよいでしょうか。cat列には"A","B"の2値しかなく、Name列には一意の文字列が格納されています。

cat <- c("A","B","B","A","A")
name <- c("aaa","ddd","bbb","ccc","eee")
weight <- c(51,55,72,57,64)
x <- data.frame(CAT=cat, Name=name, WEIGHT=weight)


お手数ですが、ご回答宜しくお願いします。

  • 関数 order() と関数 pmax() を組み合わせてはいかがでしょう。ただ、関数 pmax() に因子ベクトルを指定すると不具合が生じるため、データ・フレーム作成時に stringsAsFactors?=F をつけております。 -- とおりすがり? 2015-10-21 (水) 15:19:04
    > cat <- c("A","B","B","A","A")
    > name <- c("aaa","ddd","bbb","ccc","eee")
    > weight <- c(51,55,72,57,64)
    > x <- data.frame(CAT=cat, Name=name, WEIGHT=weight, stringsAsFactors=F)
    > 
    > sortlist <- order(x$CAT, pmax(x$CAT, x$Name)) 
    > x[sortlist,]
      CAT Name WEIGHT
    1   A  aaa     51
    4   A  ccc     57
    5   A  eee     64
    3   B  bbb     72
    2   B  ddd     55

  • ありがとうございます。しかしその方法ではName列が降順になっていないため、目的を達成できていません。 -- ? 2015-10-21 (水) 15:27:08
  • 汎用のプログラムでなくてよいのでしょう?cat が A, B の二種類しかないなど,かなり条件のきついデータフレームなので,そこを利用してプログラムを書けばよいと思います。cat によりデータフレームを二分し,各データフレームの Name で逆順にソートして,二つのデータフレームを rbind すればできあがり。 -- 河童の屁は,河童にあらず,屁である。? 2015-10-21 (水) 17:05:56
    > z <- lapply(split(x, x$CAT), function(y) {o <- order(y$Name, decreasing=TRUE); y[o,]})
    > a <- rbind(z[[1]], z[[2]])
    > a
      CAT Name WEIGHT
    5   A  eee     64
    4   A  ccc     57
    1   A  aaa     51
    2   B  ddd     55
    3   B  bbb     72
    cat が複数種あるような場合でも,rbind を以下のようにすれば無問題。
    > z <- lapply(split(x, x$CAT), function(y) {o <- order(y$Name, decreasing=TRUE); y[o,]})
    > a <- z[[1]]
    > for (i in 2:length(z)) a <- rbind(a, z[[i]])
    > a
      CAT Name WEIGHT
    5   A  eee     64
    4   A  ccc     57
    1   A  aaa     51
    2   B  ddd     55
    3   B  bbb     72
    あるいは,Name の逆順キーを作って,ソートする。これもトリッキー。
    > key <- -as.integer(factor(x$Name))
    > o <- order(x$CAT, key)
    > x[o,]
      CAT Name WEIGHT
    5   A  eee     64
    4   A  ccc     57
    1   A  aaa     51
    2   B  ddd     55
    3   B  bbb     72
    いずれにしても,あれこれうまい方法を探すより,ダサくってもサクっと動くプログラムを作る方が速い。
  • ありがとうございました。order()やpmax()の引数でどうにかしようと思っていましたが、ご提示いただいた方法で十分ですね。 -- ? 2015-10-21 (水) 20:08:56
  • 昨日は失礼致しました。では、dplyr パッケージの arrange(x, CAT, desc(Name)) でいかがでしょう。 -- とおりすがり? 2015-10-22 (木) 14:32:18

印刷の方向

cloud? (2015-10-16 (金) 14:00:41)

いつもお世話になっています。
A4の用紙方向を下の様な感じで切り分けて印刷したいと考えています。
このコマンドではプリンタのデバイスの縦横設定を手動で事前に切り替えないと、うまく動作しません。
印刷方向をうまく切り換える方法をご存じないでしょうか。

if (yokogaki == FALSE) {
	win.print(width=8, height=11, restoreConsole = FALSE, printer = "プリンタ名" )	# 縦書印刷
	par(mar = c(16, 7, 4, 4))
} else {
	win.print(width=11, height=8, restoreConsole = FALSE, printer = "プリンタ名" )	# 横書印刷
	par(mar = c(5, 4, 5, 12))
}
  • プリンタードライバの設定でなんとかならないでしょうか。環境について情報ゼロなので超能力を使ってもこの程度の回答しかできないと思います。 -- 通りすがり? 2015-10-18 (日) 07:38:11
  • 失礼しました。使用環境は複数のwindows8のパソコン。各々別のプリンタ"RICOH imagio MP C4000 RPCS"等が接続されています。
    プリンタードライバを手動で変更すればこのコマンドでも可能です。
    複数の人員が使うので容易に印刷できるようにドライバ設定の変更をプログラム内で選択する方法を知りたいです。 -- cloud? 2015-10-18 (日) 11:51:59
  • そもそもWindowsは「手動操作」が前提なので、操作が面倒なのはWindowsユーザの宿命でしょう。CLIで印刷できるMacOSXやLinuxならpostscript()の引数fileをパイプにして、landscapeオプションをつけてデータを送ると横向き印刷になります。 -- 2015-10-18 (日) 15:25:50
  • 「プリンタードライバを手動で変更すれば」よいだけの話でしょう。 --  ? 2015-10-18 (日) 20:46:45
  • Windowsユーザじゃないので外しているかもしれませんが、もしかすると、1台のプリンタで複数の設定(プリンタ名)を設定できませんか。縦向きをデフォルトとしたものと横向きをデフォルトとしたものを別々に作成できれば、プリンタ設定名の書き分けで解決するかも。 -- 2015-10-19 (月) 00:01:15
  • 情報ありがとうございます。CRANが何かないかと思ったのですがRからプリンタドライバの設定は変更できないようですね。
    1台のプリンタに複数のプリンタ名を設定すれば可能なのですが、複数のパソコンを設定するのは面倒なので、コマンドプロンプトかVBAでドライバの設定を書き換える方法を検討します。 -- cloud? 2015-10-24 (土) 12:22:14

シングルクォートとダブルクォートの違い

markovchainmontecarlo? (2015-10-14 (水) 23:07:26)

いつもお世話になっております。
ふと思ったのですが、Rにおいてシングルクォート(’)とダブルクォート(”)の違いはありますでしょうか。

以下のコードと結果から違いはないと思われますが、確かな文献などが見つかりません。
ご存知の方がいらっしゃいましたら、教えた頂けたら幸いです。

> hoge <- 3
> print(hoge)
[1] 3
> print("hoge")
[1] "hoge"
> print('hoge')
[1] "hoge"

よろしくお願いいたします。

  • コンソールに help('"') または ? Quotes と入力すれば,詳しい説明が得られます。 -- 河童の屁は,河童にあらず,屁である。? 2015-10-15 (木) 06:33:44
  • 「 河童の屁は,河童にあらず,屁である。」さま
    ご回答ありがとうございます。
    ヘルプを見ると、基本的に同じようですね。(ダブルクォートが好ましいと書いてありますが。)

    あと今回新たに試してみました。
    > print("hoge")
    [1] "hoge"
    > print('hoge')
    [1] "hoge"
    > print("'hoge'")
    [1] "'hoge'"
    > print('"hoge"')
    [1] "\"hoge\""
    何が入れ子になっているかで少し違うみたいですね。
    本件は解決とさせていただきます。ありがとうございました。 -- markovchainmontecarlo? 2015-10-15 (木) 18:53:03

データフレーム名を変数として処理したい

中阪 隆? (2015-10-14 (水) 18:13:40)

データフレームを、固定の名前ではなく、変数名で取り扱うには、どうしたら良いでしょうか?
現在は、対象のデータフレームを操作するSQl文字列を生成して、sqldfで実行していますが、これ以外の方法も探していますが、見つけられていません。

よろしくお願いします。

  • 言っていることがよくわからない。 -- 河童の屁は,河童にあらず,屁である。? 2015-10-16 (金) 21:20:12
  • プログラミングしてるとこういうことやりたくなりますよね。コマンド1行丸ごと文字列で作ってevalで実行しています。txt<-paste("hist(",DFname,"$","age",")",sep="") : eval(parse(text=txt)) -- よくわかる。? 2016-05-20 (金) 00:34:58

無題

あき? (2015-10-12 (月) 16:05:10)

最近になって、Rのパッケージをインストールして、何度か使用した後に、Rを終了すると、次回Rを起動させると、パッケージがインストールされていない状態に戻ってしまいます。前までは、Rを終了させてもパッケージは保存状態にありました。なぜこのようなことが起こるのでしょうか。

  • 題名は「無題」なのですか?
    答える方が回答しやすいように質問するのもマナーの一つだと思いますよ。

    ま、それはさておき、libraryでパッケージを呼び出していないだけですか?
    それとも
    library()
    で調べても、「パッケージ自体が」見つからない状態ですか? -- markovchainmontecarlo? 2015-10-12 (月) 17:30:43
  • library()を打ち込むと表示はされていますが、いざlibrary()で使おうとすると、インストールしなおさないといけない状態です。 -- あき? 2015-10-15 (木) 08:53:50
  • 投稿における注意事項 は読まれましたか?-- markovchainmontecarlo? 2015-10-15 (木) 18:58:38

    回答者は神通力を持ってはいません。「これこれしたが、うまく動きません」といった質問には、あなたの試みたことを回答者が再現できるような、データ、コード、エラー出力(そして、R のバージョン、使用 OS、使用非標準パッケージ名)を添えることをお勧めします。あまりに長くなる場合は適宜編集して下さい。


データ加工(NA、99999の置換)

(2015-09-29 (火) 12:42:24)

あるデータフレーム(1つの目的変数と200の説明変数)があり
・目的変数は0/1のみ
・説明変数は全て数値型でNAや外れ値の意味をもつ99999が含まれている
各説明変数について、NA、99999を該当するレコードの目的変数の平均値に置き換えたいのですが
どのようにやるとスマートでしょうか?

  • 別にスマートにやらなくてもよいと思いますが。 -- 河童の屁は,河童にあらず,屁である。? 2015-09-29 (火) 13:07:18
    > # テストデータ生成
    > set.seed(12345)
    > n <- 10
    > d <- data.frame(y=sample(0:1, n, replace=TRUE),
    +                 x1=sample(50, n, replace=TRUE),
    +                 x2=sample(250, n, replace=TRUE))
    > d[sample(n, 5), 2] <- NA
    > d[sample(n, 5), 3] <- NA
    > d[sample(n, 5), 2] <- 99999
    > d[sample(n, 5), 3] <- 99999
    > d
       y    x1    x2
    1  1    NA 99999
    2  1 99999    82
    3  1    NA   242
    4  1 99999 99999
    5  0    NA    NA
    6  0 99999    98
    7  0    20   175
    8  1 99999 99999
    9  1     9 99999
    10 1 99999 99999
    
    >  # 例解
    > d[,-1] <- sapply(d[,-1], function(z) {
    +                  z[z == 99999] <- NA
    +                  z[is.na(z)] <- mean(z, na.rm=TRUE)
    +                  z})
    > d
       y   x1     x2
    1  1 14.5 149.25
    2  1 14.5  82.00
    3  1 14.5 242.00
    4  1 14.5 149.25
    5  0 14.5 149.25
    6  0 14.5  98.00
    7  0 20.0 175.00
    8  1 14.5 149.25
    9  1  9.0 149.25
    10 1 14.5 149.25
  • 助言ありがとうございます。R初心者なのですが、全変数に対して何らかの処理を行う場合、どのように変数一覧を取得して処理をすればよいのか悩んでいました。apply系は書籍で勉強したことあるのですが利用するまでの発想にいたりませんでした。ありがとうございました。 -- 2015-10-01 (木) 12:44:56
  • 目的変数の平均値に置き換えられてないよ -- 2015-10-02 (金) 08:37:04
  • 「目的変数は0/1のみ」って書いてあったし,目的変数の平均値に置き換えるってへんじゃないか?書き間違いじゃないか? -- 2015-10-02 (金) 08:48:55
  • 「説明変数の平均値」だと自然ですよね。プログラムでもそうなっていますし。 -- 2015-10-03 (土) 18:05:08

t値がとても大きい時のp値

windsor? (2015-09-26 (土) 22:06:10)

t検定でt値がとても大きい場合、p値をpt関数で計算すると、p=0となってしまいますが、これをp=1.0E-200というような値で(その数値が統計学的に意味のある値かどうかは別として)表示することはできませんでしょうか?例えば、t値が52、自由度が4700で、以下のようなコマンドを用いた場合です。

pt(52,4700,lower.tail=FALSE)*2

どうぞよろしくお願いいたします。

  • 「t値が52、自由度が4700」ならば,計算値は 0 ですね。内部表示を 16 進で示すと,
    > sprintf("%a", pt(52,4700,lower.tail=FALSE)*2)
    [1] "0x0p+0"
    となり,コンピュータ上では「完全に 0」です。 t 値が 41 以下ならば,極めて0に近い値。内部表示も 0 ではありません。
    > sprintf("%a", pt(41,4700,lower.tail=FALSE)*2)
    [1] "0x1.ddc34cd8p-1043"
    10 進表示をしたいなら %g を指定して
    > sprintf("%g", pt(41,4700,lower.tail=FALSE)*2)
    [1] "1.9801e-314"
    > cat(sprintf("%g", pt(41,4700,lower.tail=FALSE)*2))
    1.9801e-314
    なお,計算される P 値は,「近似値」なので,こんなに小さい値の精度なんて想像するのも無駄。 いずれにせよ,あまり意味のあることではないですね。 -- 河童の屁は,河童にあらず,屁である。? 2015-09-27 (日) 10:43:08
  • どうもありがとうございました。 -- windsor? 2015-09-27 (日) 19:11:26

xに勝手に数値が格納されています。どうすれば削除できますか。

初学者? (2015-09-26 (土) 20:26:23)

Rについての質問です。xに数字を格納した覚えがないのに、xに数値が格納されている状態になります。Rを再起動、再インストールしてもxに数値が代入されたままになってしまいました。このような状態を直すためにはどのようにすればよいでしょうか。以下のように命令をうつと、エラーメッセージが表示されます。attach関数を使って、filenameのxをfilename$xの前半部分を省きたいのですが、以下のエラーメッセージがでます。

dat <- read.csv("filename.csv",header=TRUE)
attach(dat)
以下のオブジェクトは .GlobalEnv? によってマスクされています: 
x 

よろしくお願いします。

  • rm(x) とすればよいでしょう。
    そもそもは,以前の R セッションの終了時に,(意識したかしないかはともかく),「ワークスペースを保存する」を選択したからでしょう。特に意図しない場合には,「ワークスペースを保存しない」で終了するようにすればこのようなことは生じないので,無難でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-09-26 (土) 21:45:26
  • rm(x)で解決できました。ありがとうございます。 -- 初学者? 2015-09-26 (土) 21:53:38

並列計算のページについて

markovchainmontecarlo? (2015-09-25 (金) 20:31:43)

Wikiに「並列計算について」の記載が乏しいと思いましたので、ページを新たに立ち上げようかと思っていますが、このような行為をしてもいいのでしょうか。
Rで並列計算のページは存じておりますが、もう少し簡単に扱える「snowfall」パッケージの紹介などをしようと思っています。
皆様のご意見を伺いたく思います。

  • やればよいと思います。それが Wiki というものでしょう。 --  ? 2015-09-25 (金) 21:24:25

CRANの数について

markovchainmontecarlo? (2015-09-18 (金) 13:52:11)

CRANの数について質問があるので、ご存知の方がいらっしゃいましたら回答いただけると幸いです。

R3.0.2では非常に多くのCRANミラーサイトがあり、[JAPAN]では[TOKYO]と[YAMAGATA]がありました。
しかしR3.2.2では20程度しかなく、[JAPAN]はありませんでした。

今後ミラーサイトは(登録が済んでいないなどの理由から)順次追加されるとの認識でいいのでしょうか。

よろしくお願いいたします。

  • R-3.2.2からHTTPS接続によるミラーサイトが優先して表示される仕様となったようです。WindowsのR GUIの場合、(HTTP mirrors) を選択することで従来の(HTTP接続の)ミラー一覧が利用できます。 -- 鈴木@ef-prime? 2015-09-18 (金) 15:59:49
  • ご回答ありがとうございます。
    ご指摘の通り、「(HTTP mirrors) を選択」すると、従来のミラーが選択できました。

    改めての質問なのですが、[HTTPS]を積極的に選択する必要はありますか?(パッケージのダウンロードですので、あまりセキュリティーは気にしなくてもいいような気もします。)
    あと、あくまで「ミラー」ですので、どのCRANでも同じ内容でしょうか。
    同じであれば通信速度の出る[TOKYO]から選びたいと思っています。
    ご存知の方がいらっしゃいましたら、引き続きよろしくお願いいたします。-- markovchainmontecarlo? 2015-09-18 (金) 17:00:19
  • もともと基本的にRの配布システムは安全ではありませんでした. 現在はcranのマスターからcran.ism.ac.jpへのミラーにはssh経由のrsyncを用いるように先月初旬に変更しました. 一方でSSL(https)は現在証明書発行の*事務手続き*に何故か時間がかかっております...しばらくお待ちを. もちろんSSL経由での入手が推奨されます. -- cran.ism.ac.jp関係者? 2015-09-18 (金) 19:43:30
  • ご回答ありがとうございます。推奨されているようにSSL経由でのインストールをしたいと思います。 -- markovchainmontecarlo? 2015-09-18 (金) 23:18:51
  • R3.2.2からWindowsでproxy接続(特に認証要の場合)では、setInternet2(FALSE)としないと接続ではじかれる場合があります。リリース時のアナウンス通りですが、見逃している方のために。 -- tanaka? 2015-09-21 (月) 21:24:54

formulaの説明変数の指定について

CRA? (2015-09-14 (月) 11:02:07)


回帰分析において 目的変数~説明変数 の形式でlm()を実行したいのですが、dataの列名に"-"が含まれているとエラーになるようです。

#正常に実行できる
x <- trees
lm(Volume ~ Girth, data = x)

#列名を変更
colnames(x)[1] <- "A-3"
lm(Volume ~ A-3, data = x)

このような列名を含むdataではどのように説明変数を指定すればよいのでしょうか。

宜しくお願いします。

  • 苦もないこと。そのような列名を colnames で付け替えるとよいでしょう。そもそも,列名の命名規則に制限があるのですから,それにわざわざあらがう必要はないでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-09-14 (月) 11:09:32
  • lm(Volume ~ `A-3`, data = x)とするとうまくいきました。列名を変更したくない場合はこっちでもよいかなと思いました。 -- CRA? 2015-09-14 (月) 12:45:00

heatmapのラベル名の色について

ヒート? (2015-09-11 (金) 09:27:49)

お世話になります。

heatmap()で水平方向のラベルを特定の条件で色分けしたいと考えています。

x <- as.matrix(mtcars)
heatmap(t(x))

この場合、"Mazda"を含むラベルを赤、"Merc"を含むラベルを青にするにはどのようにすればよいでしょうか。
おそらくheatmap()の戻り値を使えばよいのだとは思うのですが、やり方がわかりませんでした。

環境はWin 7, R 3.0.2です。

どなたかご教示宜しくお願いします。


spatstatパッケージのKest、pcf関数の結果の違いについて

B4? (2015-09-05 (土) 07:45:52)

点パターンの凝集性を評価する際に、rがどのくらいの値でランダムな分布になるかを数値化したいと考えております。spatstatパッケージのKest関数、Lest関数を用いて、観察対象の点パターンを計算した結果と、完全にランダムな分布(CSR)から得られるプロファイルが交わる際のrの値が、pcf関数でCSRと比較した際に得られるrの値と倍くらい違うのですが、どういうことでしょうか?よろしくお願いいたします。


多重比較おける効果量・検出力について

R2? (2015-09-01 (火) 10:29:46)

お世話になります。

従来は多重比較によってp-valueを求めて有意である、有意でないという考察で終えていたのですが、"compute.es"や"pwr"ライブラリーを用いて効果量や検出力の解析をしたいと考えました。

しかし、ヘルプファイルを見てみましたがいずれのライブラリーもTukeyやDunnetのような多重比較によって得られた統計値を使用することを想定していないようでした。

多重比較における効果量・検出力を算出する方法について知見をお持ちであればご教示頂けませんでしょうか。Rでそのようなライブラリーがないというのであれば、参考書や論文の情報でも構いません。

宜しくお願いします。

  • DunnettTests?はチェック済みですか? -- 2015-09-01 (火) 13:36:58
  • 情報ありがとうございます。説明書を読みましたが効果量を求める機能が含まれていないようでした。効果量は多重比較とは縁のないものなのでしょうか。 -- R2? 2015-09-01 (火) 14:04:23

ggplotで時系列を並べる

つなかん? (2015-09-01 (火) 08:51:32)

お世話になります。ggplotってこんな図が苦手な気がします。facetとか使うと描けそうですけど、どうも見栄えがよくない。あえてggplot使うならどう描きますか?

timeval = seq(as.POSIXct("2014-07-17 10:00:00"), by="30 sec", length=10)
y1  = rnorm(10)
y2 = rnorm(10)^10
y3 = rnorm(10)
y4 = rnorm(10)

par(mfrow=c(3,1))
par(mar=c(0,4,0,4))
par(oma=c(4,0,4,0))
plot(y1~timeval, type="l",ylab="y1(mm)", axes=F)
axis(2); box()
plot(y2~timeval, type="l", ylab="y2(g)", axes=F)
axis(2); box()
plot(y3~timeval, type="l", ylab="y3")
lines(y4~timeval, type="l", col="red")
legend("bottomright", legend = c("y3", "y4"), col=c("black", "red"), lty=1)
mtext("Timeval", side=1, line=3, cex=0.8)

forecastパッケージのstl関数のエラーについて

kirioh? (2015-08-28 (金) 22:32:50)

はじめまして、お世話になります。

forecastパッケージを使った時系列データの分離(トレンド・季節変動・誤差成分)に失敗し続けています。
具体的にはA列に日付、B列に数値の入った以下のようなCSV形式の時系列データを用いて、

Date SP

2015/1/1 14360

2015/1/2 19908

2015/1/3 16210

2015/1/4 15465

2015/1/5 12514

2015/1/6 12182
※以下2015/7/31まで
以下のコードを試みたのですが、

data = read.csv('test.csv',head=T, row.names=1)
ts <- ts(data, start = c(2015,1), end = c(2015,7), frequency=365)
stl <- stl(ts, s.window="per")
stl(ts, s.window = "per") でエラー:  一変量系列だけが許されます

というエラーが発生する状況です。またdecomposeを使っても

時系列の期間が無いか、2未満です

というエラーが発生します。 国内外のサイトで調べてdataをnumericで渡したり$indexを通したりと色々試したのですが、全く解決せず、恐れ入りますがこの条件から考えられる原因及び解決法をご教示くださいますでしょうか?
tsのclassは"ts"となっており、auto.arimaやacfは出力されはします。
ただtsをプロットすると2015.000からはじまったり、acfはlag軸の目盛りが0.00からはじまったり、不完全な状態です。
バージョンは3.1.2、OSはwindows 7になります。 何卒宜しくお願い致します。

  • 投稿時の,問題でしょうが,データが1行おきなの?元のデータは違うというなら,投稿法を改める(正しく)すべし。
    本当にデータに問題が無いのかどうかを確かめたり,ほかの人がやってみる場合のことを考えれば,ここにそのデータをアップロードすべき。要するに,あなたがやったこと(エラー)を再現してみないことには,アドバイスもできないだろうということ。
    ちなみに,read.csv で読み込んだ後 data にデータが読み込めたか確認しましたか?(データがスペースで区切られているように見えるので,あなたの指定では正しく読み込めていないのではないかと思いますけど。head(data) してみなさい。)
    つぎに,ts の start, end の指定法はこれでいいの?example(ts) の最初の例だと start = c(1959, 2) は 2nd Quarter of 1959 の意味だよって書いてある風にみえるんだけど。start = c(2015,1), end = c(2015,7) では,最初の 7 個のデータしか使われないんじゃない? -- 河童の屁は,河童にあらず,屁である。? 2015-08-29 (土) 08:06:27
  • ご指摘ありがとうごさいます、また客観が欠けておりすみません。
    元データも1行おきではなく、正しくは以下になります。
    Date	SP
    2015/1/1	14360
    2015/1/2	19908
    2015/1/3	16210
    2015/1/4	15465
    2015/1/5	12514
    2015/1/6	12182
    2015/1/7	11966
    またhead(data) すると以下になっています。
    > head(data)
                SP
    2015/1/1 14360
    2015/1/2 19908
    2015/1/3 16210
    2015/1/4 15465
    2015/1/5 12514
    2015/1/6 12182
    start, endの指定についても私の誤認(YYYY,MM,DDだと思ってました)でした、ありがとうございます。 -- kirioh? 2015-08-29 (土) 15:06:10

十数万件データ同士のマージ

(2015-08-25 (火) 22:10:05)

お世話になっております。
2つのデータフレーム(共に十数万件で項目数100前後)のマージをmergeで試してみましたが、数分経っても結果は返ってきませんでした。
高速にマージしてくれるお薦めのライブラリがあれば教えてください。

  • マシン性能にもよるのでは。例えば、こちらの環境では、10万行のデータフレームをmerge()しても、1秒もかからない。 -- 2015-08-26 (水) 11:09:07
    a <- data.frame(id = 1:100000, as.data.frame(matrix(1:10000000, ncol = 100)))
    b <- data.frame(id = sample(1:100000, size = 100000),
                    as.data.frame(matrix(1:10000000, ncol = 100)))
    というデータフレームが2つあったとして、
    > head(a$id); head(b$id)
    [1] 1 2 3 4 5 6
    [1] 24019 90410 60377 38469 66968  3732
    このidでmerge()してみると、
    > system.time(ab <- merge(a, b, by = "id"))
       ユーザ   システム       経過  
         0.644      0.016      0.660 
    この通り。なお、
    > system("cat /proc/cpuinfo | grep 'model name' |uniq")
    model name	: Intel(R) Xeon(R) CPU           W3550  @ 3.07GHz
  • 私もやってみました。やはり1秒もかからないですね。
    使い方が間違っているのか,よほど特殊なデータ構造なのか。 -- 河童の屁は,河童にあらず,屁である。? 2015-08-26 (水) 15:51:26
    > system.time(ab <- merge(a, b, by = "id"))
       ユーザ   システム       経過  
         0.869      0.127      0.992 
     機種名:	Mac Pro
     機種 ID:	MacPro5,1
     プロセッサ名:	Quad-Core Intel Xeon
     プロセッサ速度:	2.8 GHz
     プロセッサの個数:	1
     コアの総数:	4
     二次キャッシュ(コア単位):	256 KB
     三次キャッシュ:	8 MB
     メモリ:	12 GB
     プロセッサ相互接続速度:	4.8 GT/s
  • 返信遅くなり申し訳ありません。 サンプルでいただいたコードは確かに私のPCでも1秒前後で処理が終了しました。 しかし私の処理したい以下のコード(変数名はダミー)ですと処理が数分経過しても終わりません。 ご指摘・助言お願いします。。。 -- 2015-08-27 (木) 13:48:03
    df <- data.frame(id = I(sample(100001:200000,size=100000)), target=rep(c(0,1)))
    d1 <- subset(df,target==1)
    d0 <- subset(df,target==0)
    nm <- "id"
    w <- tapply(df$target,df[,c(nm)],mean)
    y <- tapply(d1$target,d1[,c(nm)],length)
    z <- tapply(d0$target,d0[,c(nm)],length)
    a  <- data.frame(nm=I(names(w)),mn=w)
    b  <- data.frame(nm=I(names(y)),c1=y)
    c  <- data.frame(nm=I(names(z)),c0=z)
    d <- merge(a,b,by.x="nm",by.y="nm",all=T)
    e <- merge(d,c,by.x="nm",by.y="nm",all=T)
  • AsIs?クラスだと時間がかかるのでは? -- 2015-08-27 (木) 14:23:28
    整数型の場合
    > ai <- a; ai$nm <- as.integer(ai$nm)
    > bi <- b; bi$nm <- as.integer(bi$nm)
    > ci <- c; ci$nm <- as.integer(ci$nm)
    > system.time(di <- merge(ai, bi, by = "nm", all = TRUE))
       ユーザ   システム       経過  
         0.345      0.000      0.345 
    > system.time(ei <- merge(di, ci, by = "nm", all = TRUE))
       ユーザ   システム       経過  
         0.322      0.008      0.330 
    文字列型の場合
    > ac <- a; ac$nm <- as.character(ac$nm)
    > bc <- b; bc$nm <- as.character(bc$nm)
    > cc <- c; cc$nm <- as.character(cc$nm)
    > system.time(dc <- merge(ac, bc, by = "nm", all = TRUE))
       ユーザ   システム       経過  
         0.864      0.000      0.864 
    > system.time(ec <- merge(dc, cc, by = "nm", all = TRUE))
       ユーザ   システム       経過  
         0.872      0.000      0.871 
    文字列がキーだとちょっと時間がかかるね。しかし、いずれにしても1秒もかかりません。
  • マージキーが AsIs? の場合に merge のボトルネックは,do.call("order", a[,1, drop=FALSE]) ですね。特にマージキーを AsIs? にする必要もなければ(必要ないと思いますが),換えた方がよいでしょう。
    > system.time(do.call("order", a[,1, drop=FALSE])) 
       ユーザ   システム       経過  
        76.086      0.520     82.530 
    > ai <- a; ai$nm <- as.integer(a$nm) 
    > system.time(do.call("order", ai[,1, drop=FALSE]))
       ユーザ   システム       経過  
         0.011      0.001      0.029 
    > ac <- a; ac$nm <- as.character(a$nm) 
    > system.time(do.call("order", ac[,1, drop=FALSE]))
       ユーザ   システム       経過  
         0.217      0.001      0.225 
    > af <- a; af$nm <- factor(a$nm) 
    > system.time(do.call("order", af[,1, drop=FALSE]))
       ユーザ   システム       経過  
         0.010      0.000      0.021 
    AsIs? の場合,とんでもない処理時間がかかっているのが分かります。
    今回の例は,使い方がまずかった(データ構造が不適切だった)ということですね。-- 河童の屁は,河童にあらず,屁である。? 2015-08-27 (木) 18:21:13
  • なるほど。ありがとうございます。上記のI()はデータフレームに文字ベクトルを設定する際、ファクター型に自動変換されないようにするための処理として設定していました。実際にはループで上記のnmにdfの各項目を設定し処理させているのですが、どのようにdf$nmのクラスを判断し型変換を行えば良いでしょうか? -- 2015-08-28 (金) 02:07:49
  • > ファクター型に自動変換されないようにするため
    上の方の例に示されているように,as.character すればよいでしょう。また,マージキーが factor の場合であっても,merge 関数の中で
                bx <- x[, by.x]
                if (is.factor(bx)) 
                    bx <- as.character(bx)
    のように as.character されるので,問題ないと思いますけど。AsIs? が不都合なんですから... -- 河童の屁は,河童にあらず,屁である。? 2015-08-28 (金) 08:20:48
  • いやいや「ファクター型に自動変換されないようにするため」なら、正攻法は、stringsAsFactors?オプションの値を既定値のTRUEからFALSEに変更するとか、session-wideにするなら、スクリプトの頭や初期ファイル(e.g. ~/.Renviron)にoptions(stringsAsFactors? = FALSE)を書いておくとかでしょう。I()なんて使っちゃダメです。-- 2015-08-28 (金) 08:35:33

関数の引数にデータフレームの列名を指定する方法

su?? (2015-08-23 (日) 13:00:26)

お世話になります。

列a,b,c,,,,を持つデータフレームdfの要素を引数とする関数を作製したいと思います。
hikisu1にa列、hikisu2にb列、hikisu3にc列を指定する場合

func<-function(hikisu1, hikisu2, hikisu3){ }

という関数を作製して、使用時に

func(df$a, df$b, df$c)

としているのですが、これを、

func(a, b, c, data=df)

というように、dfの要素を指定できるような関数に作り替えたい思います。
方法について、ご教示頂けますと幸いです。

(理由はdfの他の要素も修飾することを可能とするためです。)

  • わざわざ関数にするメリットがわからないが,例えば以下のような関数
    func <- function(a, b, c, data=df) {
      name.a <- deparse(substitute(a))
      name.b <- deparse(substitute(b))
      name.c <- deparse(substitute(c))
      name.data <- deparse(substitute(data))
      str <- sprintf("data <- data.frame(%s$%s, %s$%s, %s$%s)",
                     name.data, name.a, name.data, name.b, name.data, name.c)
      result <- eval(parse(text=str))
      colnames(data) <- cbind(name.a, name.b, name.c)
      data
    }
    を定義すれば,使用例は以下のごとし。
    df <- data.frame(
    a = 101:103,
    b = sample(10, 3),
    c = letters[21:23],
    d = c(1.4, 4.5, 7.9),
    e = c("abc", "foo", "bar")
    )
    df
    ( x <- func(a, b, c, df) )
    ( y <- func(d, e, a) )
    あなたの意図に合うのかな??
    でも,そんなことで済むなら,わざわざ関数を定義しなくても,
    ( x <- df[c("a", "b", "c")] )
    ( y <- df[c("d", "e", "a")] )
    で,同じ結果を得ることも出来ます。
    わずか数回のキータイプを省略したいというなら別ですが。 -- 河童の屁は,河童にあらず,屁である。? 2015-08-23 (日) 19:59:34
  • 関数内で df の要素 a, b, c を使うということか。ならば,例解で示したように作られた data というデータフレームを使えばよいが,呼ばれたときの要素名が付いているので,名前を使ってプログラムすることはできなくなるけど?
    あなたが現在使っている func で,どういう風にプログラムされているんすかね?やろうとしていることがよくわからん。 -- 河童の屁は,河童にあらず,屁である。? 2015-08-24 (月) 14:32:22

データフレームの各項目についてclass()を適用する方法

te? (2015-08-20 (木) 21:59:32)

apply(df[1,1:dim(df)[2]],2,class) だと想定どおりの結果となりません。
numeric型のものがあるにも関わらず、すべてcharacter型と返ってきます。
どのように修正すればよいでしょうか。

  • なぜ,df[1,1:dim(df)[2]] としないといけないのかわからないが,sapply(df, class) だけでよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-08-21 (金) 05:39:50
    > sapply(iris, class)
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
       "numeric"    "numeric"    "numeric"    "numeric"     "factor" 
    > sapply(iris[1,1:dim(iris)[2]], class)
    Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
       "numeric"    "numeric"    "numeric"    "numeric"     "factor" 

ヒートマップのカラーチャートについて

mappa? (2015-06-30 (火) 15:29:08)

お世話になります。"Heatplus"ライブラリーの"regHeatmap"を用いて行列のデータをヒートマップにします。

以下のように実行するとファイル右側に表示されるカラーチャートの範囲が-2~1になりますが、この範囲を行列中の数値の範囲である1~100に対応させたいと考えました。
filefile_1.pdf

source("http://bioconductor.org/biocLite.R")
biocLite("Heatplus")
library(Heatplus)

set.seed(123)
data <- array(ceiling(runif(100,min=1,max=100)), dim=c(10,10))
colnames(data) <- rownames(data) <- 1:10
pdf(file="file_1.pdf")
plot(regHeatmap(data, col=heat.colors))
dev.off()

そこで、以下のようにbreaksでカラーチャートの範囲を指定したのですが、ヒートマップの色が白と赤のみになってしまいました。
filefile_2.pdf

set.seed(123)
data <- array(ceiling(runif(100,min=1,max=100)), dim=c(10,10))
colnames(data) <- rownames(data) <- 1:10
pdf(file="file_2.pdf")
plot(regHeatmap(data, col=heat.colors, breaks=seq(1,100,10)))
dev.off()

ヒートマップ化する行列の値とカラーチャートの色を一致させるにはどうすればよいでしょうか。"Heatplus"ライブラリーに限定せず、どんなライブラリーを使用しても構いません。環境はWindows 7の32bit、R 3.0.2です。

お手数ですが、ご回答宜しくお願いします。

  • 自己レスになりますが、fieldsパッケージのimage.plot関数でデンドログラムはできないものの、希望する結果に近いものが得られました。ありがとうございました。 -- mappa? 2015-07-02 (木) 07:49:47
  • 参考になれば -> http://d.hatena.ne.jp/myopomme/20111214/1323865945 -- akira? 2015-07-06 (月) 14:09:59

関数内でのデータフレームの成分の参照

kddoi? (2015-06-29 (月) 20:34:11)

お世話になっております。関数内でのデータフレームの成分を参照したいのですが、with関数が思った通りの動作をしません。
attachとdetachを使えば上手く動くのですが、同一名の変数が存在する可能性などを考慮してできればwithを使いたいのですが、どのようにすればよろしいでしょうか?tmp1が想定していた書き方で、回避策がtmp2となっております。

df <- data.frame(a=c(1,2,3), b=c(3,2,1))

tmp1 <- function(eq, dat) {
  return(with(dat, eq))
}

tmp2 <- function(eq, dat) {
  attach(dat)
  d <- a+b
  detach(dat)
  return(d)
}

tmp1(a+b, df)
tmp2(a+b, df)

以上、よろしくお願いいたします。

  • 久しぶりの投稿でpukiwikiの書式を忘れており、読み辛くて失礼いたしました。データフレームの作成からtmp2関数までがRコードです。やや素直でない実装ですが、一応以下のような解決策も別途見付けたので、追加で報告させていただきます。 -- kddoi? 2015-06-29 (月) 20:45:20
    tmp3 <- function(eq, dat) {
       eval(parse(text=paste("with(", deparse(substitute(dat)),",", deparse(substitute(eq)), ")")))
    }
  • > 久しぶりの投稿でpukiwikiの書式を忘れており
    言い訳するより,「投稿における注意事項」を読んで,書式を確認して書き直せばよいだけでしょう。面倒だから,直しておきましたけど。
    計算式 a+b は,引数にできませんよね...
    実際の所,何がやりたいのかよくわからないけど,普通にやればよいだけでは? -- 河童の屁は,河童にあらず,屁である。? 2015-06-29 (月) 21:40:14
  • 後からページ全体の編集ができることに気が付きましたが、既に直していただいた後でした。お手数をお掛けいたしました。実際はSurv(time, status)などSurvオブジェクトを関数の引数として受けとって、timeやstatusを関数内で参照したいのですが、fn(Surv(time, status), data=df)のような状況にも対応したい、というのが最終目標でした。 -- kddoi? 2015-06-29 (月) 21:55:46
  • > のような状況
    言っていることが,よくわからないなあ。呼出と関数の引数の対応を示せば解決法が示されるかもね。 -- 河童の屁は,河童にあらず,屁である。? 2015-06-29 (月) 22:02:52

T検定を行うためのデータ加工について知りたい。

ちまっく? (2015-06-08 (月) 03:50:53)

Rによる統計について。

当方、Rの初心者です。
Rによる「 T-検定 」を行いたい所存です。長文で失礼します。

元データが約5万あり、T-検定を行うため、データの加工を簡単に行える方法をお聞きしたいです。

元データは以下のような形です。

セッションID,アイテムID,大分類,小分類,ブランド,閲覧日時,購入の有無
6033,162429,日用品,歯ブラシ,647,43:06.0,0
6033,249019,雑貨,枕カバー,240,43:17.0,1
1003,169032,日用品,洗剤,340,21:34.0,0
1003,42543,日用品,歯ブラシ,205,25:55.0,0
1003,190788,日用品,洗剤,86,28:57.0,0
7062,154026,日用品,歯磨き粉,47,43:56.0,0
7062,30637,日用品,歯磨き粉,151,44:21.0,0
8011,168023,雑貨,プランター,150,44:52.0,0
8011,198903,雑貨,鉢,240,45:28.0,1
8011,157220,日用品,シャンプー,9,47:22.0,0



データを下データのように加工するための簡単な方法をお教えください。
セッションID毎に
大分類
・購入の場合、購入するまでに大分類上で何品閲覧したか
・非購入の場合、大分類上で何品閲覧したか
小分類
・購入の場合、購入するまでに小分類上で何品閲覧したか
・非購入の場合、小分類上で何品閲覧したか
滞在時間
・購入の場合、購入するまで何時間、分、秒、滞在したか(閲覧一番目で購入した際は、0:00で良いです。)
・非購入の場合、何時間、分、秒、滞在したか

このようなデータの形にしたい↓
大分類閲覧数(購入),大分類閲覧数(非購入)
2,1
1,1
小分類閲覧数(購入),小分類閲覧数(非購入)
2,2
2,1
滞在時間(購入),滞在時間(非購入)
0:11,7:23
0:00,0:25

以上です。
よろしくお願いします。

  • 返答がない理由は,データ処理の仕様が相当に複雑であるにも関わらず,説明が不十分であること。条件を満たすには相当なプログラムが必要であるにも関わらず,説明が不十分。または,そんな,面倒なものを回答するのはたいぎだなあということ。もうすこし,問題点を明確にして,解決が難しい点を明確に述べれば回答しようかなという人もいるかも。 -- 河童の屁は,河童にあらず,屁である。? 2015-06-15 (月) 21:46:34

リストの中身に一括して関数を適用する。(eval(parse(text="")の中身の変数名を番号順に繰り返したい。)

たけ? (2015-06-03 (水) 20:56:34)

以下のように、データよって長さが変化するinputについて、
計算結果をリストに格納し、リストの各値に基づく集計をしたいと思います。
最後のsum以下の部分をinputの数に合わせて増減させる良い方法がありましたらご教授いただければ幸いです。

input <- c(10,20,30)#与えるデータの数はいつも3つではない。
list <- list(0)
for(i in 1:length(input)){ list[[i]] <- input[i]/10} #任意の計算
sum(list[[1]],list[[2]],list[[3]])#ここをinputの長さに応じて変化させたい。

なお、この例であればリストを展開してしまう方法もあると思いますが、実際の計算はリストの中にあるフォーマットは複雑で、sumではなく専用の関数なので、上記のようにリスト1からを並べて記述する必要があります。eval(parse(text="ここを工夫する"))などとしないといけないのではないかという所まで理解できています。
どうぞよろしくお願いします。

  • eval(parse...を使わなくても、do.call(sum, list) でOKでしょう。do.call(rbind, list(iris[1,], iris[2,], iris[3,])) のように使えます。 -- 2015-06-03 (水) 23:48:35
  • callという関数があることは認識していましたが、リストにこういう使い方できるものなのですね。シンプルな解決策で感動しました。 -- たけ? 2015-06-05 (金) 02:16:50

半角文字から全角文字への変換

分分? (2015-05-27 (水) 17:39:05)

お世話になります。

以下のように英数字やスペース、記号からなる半角文字列を全角文字列に変換したいのですが、よい方法があればご教示ください。環境はWindows 7のR 3.0.2です。

a <- c("asdf","12 /_")


宜しくお願いします。

  • chartr 関数を使う。 -- 河童の屁は,河童にあらず,屁である。? 2015-05-28 (木) 11:49:42
    h <- "A-Za-z0-9~!@#$%^&*()_+`={}|[]\\:\";'<>?,./ -" # "-" は一番最後に指定
    z <- "A-Za-z0-9~!@#$%^&*()_+`={}|[]\:”;’<>?,./ −"
    a <- c("asdf","12 /_")
    chartr(h, z, a)
  • ご回答ありがとうございます。ニーズがないのかいろいろと検索しても方法が分からず困っていました。 -- 分分? 2015-05-28 (木) 19:30:17
  • 文字列中に"-"が含まれていると文字化けしてしまいます。なぜでしょうか? a <- c("asdf","1-2 /_");chartr(h, z, a) -- 分分? 2015-05-29 (金) 08:16:50
  • Windows ですか?Mac OS X では,問題なく動きますが。文字化けって,何がどのようにばけるのかな?
    それはともかく,"-" はくせ者なので(regexp で範囲を表すメタ記号),以下のように,h, z の最後にある 1 文字( "-", "−")を取り除いて,"-" の変換は2段階目に gsub でやるとか? -- 河童の屁は,河童にあらず,屁である。? 2015-05-29 (金) 11:10:00
    > h <- "A-Za-z0-9~!@#$%^&*()_+`={}|[]\\:\";'<>?,./ " # 最後の - を取り除く
    > z <- "A-Za-z0-9~!@#$%^&*()_+`={}|[]\:”;’<>?,./ " # 最後の - を取り除く
    > a <- c("asdf","1-2 /_")
    > gsub("-", "−", chartr(h, z, a))
    [1] "asdf"     "1−2 /_"
  • Windowsです。上記のように実行すると"asdf" "x「「\n嗟\020" と出力されます。ご提示頂いたgsubを使う方法だと文字化けせずに処理できました。ありがとうございました。 -- 分分? 2015-05-29 (金) 15:14:10

印刷について

cloud? (2015-05-24 (日) 12:48:35)

お世話になります。

windows7及び8でR i386 3.2.0を使用しています。
clanはRODBCのみ使用しています。
デバイスはwin.print()を使用しています。

複数枚のグラフをループさせて1度に作成しています。
1枚ごとにdev.offしている為、plot関数を通る度にwindowsのプリンタダイアログが表示されて印刷ボタンをクリックしなければならない為、効率が良くありません。

これを回避して、印刷ボタンを1回クリックのみでグラフを連続印刷する方法をご存知ないでしょうか。
解説書や、webを調べたのですが、印刷については詳しい資料が見つからなくて困っています。解決策をご教示頂ければ幸いです。

  • ?win.printとして, printer引数について調べましょう -- 2015-05-25 (月) 19:53:57
  • for (j in 1:5) { -- cloud? 2015-05-25 (月) 22:12:15
  • ありがとうございました。プリンタ名を指定するとダイアログは出なくなり連続印刷も成功しました。 -- cloud? 2015-05-25 (月) 22:43:08

gnupack12.03におけるESSの導入方法

gnu? (2015-05-19 (火) 11:43:15)

お世話になります。

Windows7でgnupack_devel-12.03のemacsを使用しています。
ESSを使用したいと思い、
1 .emacs.d/site-lispにessフォルダを作成
2 同フォルダ内のess/lisp/ess-site.elの329行を
 Rのインストール先に合わせて次のように変更
(setq-default inferior-R-program-name "C:/r/bin/i386/Rterm.exe")
3 init.elに次の行を追加
(require 'ess-site)

その上でemacsを再起動すると、次のようなメッセージが出て、ESSが機能しません。

Warning (emacs): None of 'w32-short-file-name, 'win32-short- file-name,
or 'mswindows-short-file-name are defined!
You will have to manually set   ess-program-files (in ess-custom.el) to
the correct "8.3"-style directory name.
Warning (initialization): An error occurred while loading `/home/.emacs.d/init.el':

Symbol's function definition is void: w32-short-file-name
...

ess-custom.elを調べてみたのですが、修正方法がわからず困っています。
解決策を御教示いただければ幸いです。

  • Windows固有の話だと回答がつきにくいですね。ホームディレクトリの.emacs.d/site-lispにessを配置したので、どうしても8.3形式のフォルダ名が必要になってトラブルになっていると予想。正攻法はess-custom.elを正しく編集するのだろうけど、essの配置先をC:/r/essみたいな場所にして、init.elにC:/r/essのパスを追加すると、8.3形式に読み替える必要が無くなって、簡単に解決するかも。 -- 2015-05-19 (火) 12:22:22
  • 早速の御回答ありがとうございます。 御指示の方法を試してみましたが、 同じエラーが表示されてしまいました。残念です。 -- gnu? 2015-05-19 (火) 13:27:41
  • じゃあ、正攻法でess-program-filesを8.3形式で設定しよう。ここを参考にして、init.elに追記すればどうだろう。 -- 2015-05-19 (火) 15:49:48
  • いろいろと試行錯誤していたため、お返事が遅くなって申し訳ありません。 御教示のように、init.elに次の1行を追加しました。
    (setq ess-program-files "/c/R-3.2.0/bin/i386/Rterm.exe")
    すると、ワーニングが次の4行に減りました。
    Warning (emacs): None of 'w32-short-file-name, 'win32-short-file-name, 
    or 'mswindows-short-file-name are defined! 
    You will have to manually set   ess-program-files (in ess-custom.el) to 
    the correct "8.3"-style directory name. ~ 
    また、M+X RでRが起動しました!しかし、次のようなメッセージが出て、 Rがうまく機能しません。
    load ESSR: + + + + Error in file(filename, "r", encoding = encoding) :     
    コネクションを開くことができません   
    追加情報: Warning message:  In file(filename, "r", encoding = encoding) :
    ファイル '/home/.emacs.d/site-lisp/ess/etc/ESSR/R/.load.R' を開くことができません:
    No such file or directory   
    しかし、「.load.R」というファイルは確かに存在しています。 御陰様で、一歩前進しましたが、問題が残っている状況です。 -- gnu? 2015-05-20 (水) 11:32:22
  • ess-program-filesには、名前の通り、Rのインストール先を設定するのではなく、ESSのインストール先を指定すると思うのですが。またインストール先は8.3形式で指定することもお忘れずに。/home/.emacs.d/site-lisp/ess/etc/ESSR/R/.load.Rの存在をどうやって確認しましたか?エクスプローラなどファイラーでクリックしながら.load.Rを見つけたのなら、.load.RというファイルがHDDのどこかに存在しても、/home/.emacs.d/site-lisp/ess/etc/ESSR/R/.load.RというPATHの.load.Rは存在しないのでしょう。 -- 2015-05-20 (水) 21:21:12
  • 御指摘のとおり、init.elを次のように変更してみました。
    (setq ess-program-files "c:/GNUPAC~1.03/home/EMACS~1.D/SITE-L~1/ess/lisp/ess.el") 
    しかし、4行のワーニングは相変わらず出てしまいます。 -- gnu? 2015-05-21 (木) 11:21:18
  • > /home/.emacs.d/site-lisp/ess/etc/ESSR/R/.load.R
    について指摘された件はどうなの? -- どうでもいいけど? 2015-05-21 (木) 23:20:43
  • 失礼しました。 > /home/.emacs.d/site-lisp/ess/etc/ESSR/R/.load.R については、emacsから普通にC+X C+Fで問題なく開けます。 -- gnu? 2015-05-22 (金) 10:10:46

zooライブラリーを、古いバージョンに戻す方法

tt? (2015-05-14 (木) 13:14:39)

こんにちは。
zooのパッケージを最新のzoo_1.7-12に更新後、既存のプログラムで問題が起こるようになりました。とりあえず、旧バージョンに戻したいのですが、どうすべきがご教授頂けないでしょうか?
使用しているのは、Windows版R i386 3.1.3です。
よろしくお願いします。

  • どのような問題が起きるのか。それを解決するにはどのようにしたらよいかが,第一ではないでしょうかね。
    パッケージのバージョンダウンならば,http://cran.md.tsukuba.ac.jp/bin/windows/contrib/ から必要なものをダウンロードして,自分でインストールすればよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-05-14 (木) 13:59:52
  • 河童様、ありがとうございます。とりあえず動く環境を取り戻してから、問題を考えようと思っていました。 -- tt? 2015-05-15 (金) 00:53:02
  • 複数のバージョンのパッケージをインストールして使い分けることは可能です。単純に旧バージョンに戻すのではなく、別の場所に新しく旧バージョンをインストールしてはいかがでしょうか。ただし、R 3.1.3用のzooの旧バージョンのバイナリが見あたらない場合はソースファイル(tar.gzファイル)からインストールすることになりますが、コンパイルに慣れていないWindowsユーザだとそれなりの勉強と試行錯誤が必要になる覚悟が必要です。 -- 2015-05-16 (土) 18:14:14
  • ありがとうございます。河童様のご指摘のサイトから、旧バージョンのライブラリー(バイナリーを含む)を入手できました。最新バージョンのライブラリーはディレクトリ名を変更し、旧バージョンを読み込むようにすると、問題なく使えています。 -- tt? 2015-05-17 (日) 14:57:07
  • 該当ライブラリーのNEWSに、従来からの変更点が具体的に記されていました。その情報から問題点を解決できました。ありがとうございます。 -- tt? 2015-08-02 (日) 17:25:03

3次元有向線分とラベルの表示

たにし? (2015-05-09 (土) 13:26:58)

3次元空間上の有向線分を始点/終点の座標を指定して表示し、あわせて当該有向線分に対するラベルを表示するにはどうしたらよいでしょうか。有向ですので単なる線ではなく矢印等の形になっていないと困ります。

  • どこまでわかっているのかわからないのですが,rgl パッケージの segments3d などを使えばよいでしょう。ただ,arrows に対応するような関数はないので,矢印の先については自作するしかないかな。points3d でごまかすことにするか。 -- 河童の屁は,河童にあらず,屁である。? 2015-05-10 (日) 08:53:39
  • やはり出来合いの関数などはありませんか。 -- たにし? 2015-05-10 (日) 11:18:54
  • plot3Dパッケージに関数arrows3Dがあります.ヘッドの形はtypeで指定できます. -- 2015-05-14 (木) 13:41:52
  • ありがとうございました。 -- たにし? 2015-05-18 (月) 17:56:51

glmmMLの結果のcallの画面出力をテキスト化してエクセルに書き込むには

ぷうや? (2015-05-08 (金) 17:18:36)

glmmMLの実行結果のcallを、エクセルファイルに出力したいのです。やり方を教えてください。

> myResult <- glmmML(y ~ x1 + x2 + x3, family = "poisson", data = myData, cluster = myID)

> myResult$call
glmmML(formula = y ~ x1 + x2 + x3, family = "poisson", data = myData, cluster = myID)


この、"glmmML(formula = y1 ~ x1 + x2 + x3, family = "poisson", data = myData, cluster = myID)"をそのままテキスト化して、エクセルのシートの一つのセルにwrite.xlsx()を使って自動で書き込むコードを書きたいのです。クリップボードなどを経由する方法ではなく、指定したファイル名、シート名のエクセルシートに書き込む方法が知りたいです。ちなみに使用OSはMac OS 10.9.5です。よろしくお願いします。

  • 1行だけ書くのですか(どういう目的なんでしょうかね?)。
    write.xlsx を使って,myResult$call で書かれるとおりの文字列を書くのなら,以下のようにすればできることはできますが。 -- 河童の屁は,河童にあらず,屁である。? 2015-05-08 (金) 17:57:57
    myID <- factor(rep(1:20, rep(5, 20)))
    y <- rpois(100, lambda=2)
    x1 <- rnorm(100)
    x2 <- rnorm(100)
    x3 <- rnorm(100)
    myData <- data.frame(y, x1, x2, x3, myID)
    # ここまで,テストデータの用意
    myResult <- glmmML(y ~ x1+x2+x3, family="poisson",
                       data = myData, cluster = myID)
    # 以下の 3 行でファイルに出力
    a <- as.character(myResult$call) # formula を character に
    b <- sprintf('%s(formula = %s, family = "%s", data = %s, cluster = %s)', # 文字列作成
                 a[1], a[2], a[3], a[4], a[5])
    write.xlsx(b, file="foo.xlsx", sheetName="bar", # ファイルへ出力
               col.names=FALSE, row.names=FALSE)
  • なるほど!やはり自分で整形しなおさなくてはならないのですね。ちなみに目的はというと、yだけ代えた複数のモデル実行結果を同じエクセルファイルに表形式で書き出すのですが、どんな条件で実行したか、覚え書き程度にcallを書き込んでおきたかったのです。ありがとうございました。 -- ぷうや? 2015-05-11 (月) 12:01:51

カナ文字を列名に持つ行列を Sweave 処理するときにエラー

河童の屁は,河童にあらず,屁である。? (2015-04-22 (水) 13:45:58)

たまには私も質問したい。
以下のような内容の test.Rnw (エンコーディングは EUC-JP)

<<>>=
result <- matrix(1:4, 2)
colnames(result) <- c("a", "ア")
result
@

を,以下のようなファイルで Sweave 処理すると

#!/usr/bin/Rscript --vanilla
Sweave("test.Rnw", encoding="euc-jp")

できあがる test.tex の大きさが途方もなく大きくなる。

-rw-r--r--  1 foo  503  1000187  4 22 13:33 test.tex

どんな風になっているか hexdump で見てみると

0000080 7d 0a 20 20 20 20 20 61 20 20 20 a5 a2 20 20 20
0000090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
*
00f42c0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 5b 31

となっており,* の部分に 20 がびっしりと詰まっている。
カタカナの列名を付けようとするとこのようなことが起こるようだ。

<<>>=
result <- matrix(1:4, 2)
colnames(result) <- c("a", "b")
result
@

だと,

-rw-r--r--  1 foo  503  183  4 22 13:40 test.tex

で,何の問題もない。
何がいけないのか,回避策はあるのか。

  • Euc-jpなRを用意できないので追試できませんが、少なくともutf-8環境だと正常に動作しています。回避策として「utf-8を使う」というのはいかが。 -- 2015-04-22 (水) 14:01:58
    \documentclass{jsarticle}
    \begin{document}
    <<echo=false>>=
    result <- matrix(1:4, 2)
    colnames(result) <- c("a", "ア")
    result
    @
    \end{document}
    結果
    \documentclass{jsarticle}
    \usepackage{Sweave}
    \begin{document}
    \begin{Schunk}
    \begin{Soutput}
         a ア
    [1,] 1  3
    [2,] 2  4
    \end{Soutput}
    \end{Schunk}
    \end{document}
    hexdumpの結果
    $ hexdump -C test.tex
    00000000  5c 64 6f 63 75 6d 65 6e  74 63 6c 61 73 73 7b 6a  |\documentclass{j|
    00000010  73 61 72 74 69 63 6c 65  7d 0a 5c 75 73 65 70 61  |sarticle}.\usepa|
    00000020  63 6b 61 67 65 7b 53 77  65 61 76 65 7d 0a 5c 62  |ckage{Sweave}.\b|
    00000030  65 67 69 6e 7b 64 6f 63  75 6d 65 6e 74 7d 0a 5c  |egin{document}.\|
    00000040  62 65 67 69 6e 7b 53 63  68 75 6e 6b 7d 0a 5c 62  |begin{Schunk}.\b|
    00000050  65 67 69 6e 7b 53 6f 75  74 70 75 74 7d 0a 20 20  |egin{Soutput}.  |
    00000060  20 20 20 61 20 e3 82 a2  0a 5b 31 2c 5d 20 31 20  |   a ....[1,] 1 |
    00000070  20 33 0a 5b 32 2c 5d 20  32 20 20 34 0a 5c 65 6e  | 3.[2,] 2  4.\en|
    00000080  64 7b 53 6f 75 74 70 75  74 7d 0a 5c 65 6e 64 7b  |d{Soutput}.\end{|
    00000090  53 63 68 75 6e 6b 7d 0a  5c 65 6e 64 7b 64 6f 63  |Schunk}.\end{doc|
    000000a0  75 6d 65 6e 74 7d 0a                              |ument}.|
    000000a7
  • よんどころない理由で,euc-jp を使わないといけないので。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-22 (水) 14:07:21
  • uft-8環境で問題のないtexファイルを作成してから、nkfで最終的なeuc-jpのtexファイルを作成するように、Makefileを書くとか、シェルスクリプトを書くとか。 -- 2015-04-22 (水) 22:16:07

数字から文字を取って平均値を求めたいのですが

さくら? (2015-04-22 (水) 13:40:23)

66avg のような数字が並んでいます。(csvのファイルになっています)
まず,数字からavgをとります
次に,上から3つずつ平均値を求めます.
方法を教えてください。
困っています。

  • データをベクトルに入れて(入っているとして),以下のようにする。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-22 (水) 13:55:34
    x <- c("55avg", "66avg", "17avg", "62avg", "30avg", "69avg",
           "38avg", "91avg", "90avg", "34avg", "56avg", "78avg")
    colMeans(matrix(as.numeric(sub("avg", "", x)), 3))
  • ありがとうございました.X=read.csv("197714.csv") cclMeans(matrix(as.numeric(sub("avg","",x)),3))と入力するとcclMeansが使えないというメッセージがでてしまいます.教えてください -- さくら? 2015-04-22 (水) 18:14:41
  • cclMeans じゃなくて colMeans だよ。しかも,read.csv で X に読み込んだのなら大文字の X にしないと。意味をちゃんと考えてね。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-22 (水) 18:15:47
  • すみません 直しました 今度は,強制変換により NA が生成されました と出てしまいます 平均値が表示されればいいのですが お願いします -- さくら? 2015-04-22 (水) 18:34:09
  • ああそう。x には文字列ベクトルが入っているべきだけど,read.csv で読み込むと,Factor になっているのだね。
    colMeans(matrix(as.numeric(sub("avg", "", as.character(x[,1]))), 3))
    としないとだめだね。
    それとね,197714.csv にどのようにデータが入っているか,最初の数行で良いから,書いておいて! -- 河童の屁は,河童にあらず,屁である。? 2015-04-22 (水) 18:37:50
  • 平均値が出ました!!!数字を1行に並べるにはどうしたらいいでしょうか.画面をいじっても2行になってしまいます.データはエクセルの表に上から23avg,65avg,87avgのような数字が並んでいます。よろしくお願いします。 -- さくら? 2015-04-22 (水) 19:20:45
  • ちょっとは自分で出来ませんかね?R は1行の文字数を指定できるので,実行の前に,options(width=200) とでもすれば。200 でも 300 でも好きなだけの文字数を指定すれば。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-22 (水) 20:03:48
  • これは便利ですね.今まで苦労していました。河童さんに感謝します. -- さくら? 2015-04-22 (水) 21:07:19

pdf()について

Pikyu? (2015-04-21 (火) 20:26:33)

お世話になります。pdf()で横幅の広い画像を保存したいのですが、widthが200を超えると保存されたファイルが真っ白になってしまいます。

pdf(file="abc1.pdf", width=200, height=7)
plot(1:10)
dev.off()

pdf(file="abc2.pdf", width=201, height=7)
plot(1:10)
dev.off()

この現象を回避するにはどうすべきでしょうか。環境はWindows 7 64bit, R3.1.2です。

よろしくお願いします。

  • 横幅が200インチと言うことは5.08mですよね。本当にそのサイズで画像を用意するのですか?そこまでいくと、ポスターというより壁紙ですね。なお、pdf形式のグラフィックディバイスは、pdf()の他にもcairo_pdf()などいくつかの選択肢がありますので、出来るかどうか試してみて下さい。こちらにはWindows環境がないので確かめられません。 -- 2015-04-21 (火) 20:55:50
  • PDF ファイルの特性を理解しておられない。PDF ファイルの画像は,出力時に元のファイルの大きさに関わらず任意の大きさで印刷できるのです。しかも,png や jpeg とは違って,拡大しても,ギザギザにならない。つまり,元のファイルはほどほどのサイズで作っておき,出力時に大きなサイズを指定すればよいのです。width=2, height=0.07 で出力したファイルを 100 倍して印刷すればよいだけのことでは?(そんな極端なことしたことはないけど,出力時に倍率を上げて大きな出力をしたことはあるので)。高さはほぼ 7*2.5 = 17.5 cm に過ぎない ので,長さの制限のないプリンタ(ドライバ)を使えば,どうってことないでしょ。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-21 (火) 21:13:09
  • 河童さん、実際にpdf(file="abc2.pdf", width=2, height=0.07);plot(1:10)とやってみてから書き込んでいますか? -- 2015-04-21 (火) 21:18:06
  • 私は,河童ではないし...
    > 実際にpdf(file="abc2.pdf", width=2, height=0.07);plot(1:10)とやってみてから書き込んでいますか?
    確かに,この時点では実際にやって書いているわけではありませんでした。
    あなたの指摘は,あなたが書いたプログラムでは,
    以下にエラー plot.new() : figure margins too large
    が出るでしょう?ということなんでしょうかね。そうね。そりゃそうだわ。縦横比がでたらめなんだもの。
    でも,以下のようなプログラムではエラーメッセージは出ないし,出来たファイルを見てみるとそれなりの図は描けているでしょう?更に適切なグラフ(拡大印刷したらちゃんとしたグラフになるような)を描くには,もう少し注意が必要でしょうけど。もっとも,本当にそのようにして描いたグラフを拡大印刷したら目的のグラフが得られるかどうかは知らない(ちゃんと設定すれば出来るはずとは思うのだけど,そこまでの自信もないし,やってみる暇もない)
    pdf ファイルの仕様策定者と R の開発者に敬意を払いましょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-21 (火) 21:54:43
    pdf(file="abc2.pdf", width=2, height=0.07)
    old <- par(mar=0.01*c(3,3,1,1))
    x <- seq(0, 100*pi, length=1000000)
    y <- sin(x)
    plot(x, y, cex=0.005, xaxt="n", yaxt="n")
    par(old)
    dev.off()
    または,
    pdf(file="abc2.pdf", width=2, height=0.07)
    old <- par(mar=0.01*c(3,3,1,1))
    plot(c(0, 2), c(0, 0.07), type="n", xaxt="n", yaxt="n")
    text(0, 0.035, paste(rep("1234567890", 100), collapse=""), cex=0.1)
    par(old)
    dev.off()
    あ,ごめんごめん,質問者の方へ
    最初に戻って,
    > widthが200を超えると保存されたファイルが真っ白になってしまいます
    あなたの環境は Windows なんでしょうかね?Mac だと,width=201 でも,ちゃんと描かれていましたよ。
    Windows の場合も,ちゃんと描かれているのでは?縮小率が大きすぎて,図の細部が見えなくなっているだけではないのかな?図を拡大表示してみれば,ちゃんと描画されているのが確認出来るのではないかと思いますが。ちゃんと描画できていれば,ちゃんと印刷できると思いますよ。
    fig.png
  • 皆さんご回答ありがとうございました。width=201では軸すら表示されないので、そういう仕様になっているのでしょう。画像を大きくせず、文字を小さくして対応してみます。 -- Pikyu? 2015-04-22 (水) 08:00:31
  • acrobat readerでは表示出来ないというだけですが... -- なかま 2015-04-22 (水) 08:51:48
  • > width=201では軸すら表示されないので、そういう仕様になっているのでしょう。
    スレッドのどこを読んでいるのかな?Windowsでもちゃんと描かれている。acrobat reader では見えないが,「リーダー」で開いて拡大してみ(ファイルアイコンを右クリックして「プログラムから開く」で「リーダー」を選択)。ちゃんと見えるから。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-22 (水) 10:06:21

カプランマイヤー曲線にn.at.riskを入れたいのですが

sawako? (2015-04-21 (火) 08:43:20)

初めまして。
初歩的な質問で恐縮です、ヒントでもいいので教えていただければ幸いです。
よろしくお願いいたします。


survplotを用いてカプランマイヤー曲線にn.at.riskの表をいれようとrmsパッケージをダウンロードしました(「パッケージ ‘rms’ は無事に展開され、MD5 サムもチェックされました」の表記確認)。

「 関数 "survplot" を見つけることができませんでした」のエラーメッセージが出てしまいます。

ネット上でいろいろ調べて「library(rsm)」「library(survplot)」などのコマンド入力しているような記述もあったのですが、どちらも「’ ’という名前のパッケージはありません」と出てきてしまいます。

またlibrary(survival)は実行済みです。

お知恵を貸していただきたく思います。よろしくお願いいたします。

  • 「rmsパッケージをダウンロードしました」って,どうやってダウンロードしたんですか?install.packages でやったの?library(rms) で「'rms' という名前のパッケージはありません」が出るなら,インストールされていないでしょう。rsm は無関係なパッケージだし,survplot は rms に含まれる関数であってパッケージじゃないので,library(survplot) なんてでたらめやってもだめ。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-21 (火) 09:56:47
  • コメントありがとうございました。「ダウンロード」という表現が間違っていたのですね、申し訳ございませんでした。「パッケージのインストール」というところか「rms」をダブルクリックしました。「パッケージ ‘rms’ は無事に展開され、MD5 サムもチェックされました」の表記はインストールできたという意味とは違うのですね。 -- sawako? 2015-04-21 (火) 11:02:51
  • 「パッケージ ‘rms’ は無事に展開され、MD5 サムもチェックされました」」だけでなく,「rms」をダブルクリックした後にコンソールに表示された全てをここにコピー&ペーストしてください。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-21 (火) 11:36:15
  • rmsという名前のパッケージなのに、library(rsm)とタイプミスをしているのは、本当にそう入力したのか、それともここに書き込むときにタイプミスしたのか、どっちですか?入力したままをコピペするか、タイプミスが完全になくなるまで推敲してくれないと、助言する側も迷走するよ。 -- 2015-04-21 (火) 21:08:04
  • 「library(rsm)とタイプミスをしているのは、本当にそう入力した」のでしょうね。よくわからないから,適当に,色々やったと言うことでしょう。回答者側としても,迷走なんかしてないつもりですけど。そんな些細なことに影響されるほどナイーブではないつもりですけど。どうせ,いいかげんな対応をして,応答も中途で打ち切るような人だとしたら,それなりの帰結を生むだけでしょう。知ったこっちゃない。好きなだけ悩めばよい。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-21 (火) 21:22:08

マージとsumを同時にやる方法

うま? (2015-04-14 (火) 17:58:19)

連日失礼します。
▼サンプル

識別ID,視聴時間,性別
A,1,men
A,2,men
A,3,men
B,4,men
B,5,men
B,6,men
B,7,men
C,8,women
C,9,women
D,10,women

▼求める結果

A,6,men
B,22,men
C,17,women
D,10,women

さらにここから散布図を作りたいと思っています。
(男性女性別にどこに集中しているのかの傾向を見たいと思っています。
今、下記サイトを見ながらトライしているのですが、一日かけても導き出せず。
http://sssslide.com/www.slideshare.net/abicky/r-10128090
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/43.html

どうぞよろしくお願いします!

  • ちょっと不細工だけど以下のようにするか。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-14 (火) 19:17:50
    > d <- as.data.frame(t(sapply(split(a, a$識別ID), function(d)
    +           list(as.character(d$識別ID[1]), sum(d$視聴時間), 
    +                as.character(d$性別[1])))))
    > d <- data.frame(matrix(unlist(d), ncol=3))
    > d[,2] <- as.numeric(d[,2])
    > d
      X1 X2    X3
    1  A  4   men
    2  B  3   men
    3  C  2 women
    4  D  1 women
    散布図ってどんなの?横軸に性別縦軸に視聴時間というのなら,
    plot.default(d[,3],  d[,2], pch=19)
    で,描けるでしょ。
  • ありがとうございます。色々とすみません。助かりました。 -- うま? 2015-04-14 (火) 20:03:52

重複カウントと平均について

うま? (2015-04-13 (月) 19:43:22)

お世話になります。

Rで以下の式を計算しようとしているのですが、ちょうどよい方法が見つかりません。
マージ関数やsumif関数などを利用したのですが、上手くいかなく思案しています。

識別ID,視聴時間,性別
A,1,men
A,2,men
A,3,men
B,4,men
B,5,men
B,6,men
B,7,men
C,8,women
C,9,women
D,10,women

求める結果

men
 sum=28, ave=14
women
 sum=27, ave=13.5

識別IDは同一だと同じ人であることを指しています。
上記のサンプルでいうと視聴者は4人ということになります。

マージやsumifなどでは上手くいかないものなのでしょうか?
ヒントだけでもお願い致します。

  • ave は,性別の合計視聴時間を人数で割るということと解釈して,以下のようになるかな。データフレームの名前を a として,
    > sapply(split(a, a$性別), function(b) c(sum(b$視聴時間), sum(b$視聴時間)/length(levels(factor(b$識別ID)))))
         men women
    [1,]  28  27.0
    [2,]  14  13.5
    うまい方法より,確実な方法を求めるべし。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-13 (月) 23:27:16
  • カッパさん -- うま? 2015-04-14 (火) 17:14:32
  • 河童さん ありがとうございます。助かります。ちなみにですが、Aの視聴者、Bの視聴者、Cの視聴者のそれぞれの視聴時間を別テーブルに保存する事は可能なのでしょうか?もし可能であれば教えていただけると幸いです! -- うま? 2015-04-14 (火) 17:15:48
  • 視聴者ごとの散布図を作れないかと思っています。自分でも考えているのですが、こちらも同じく良い方法が見つからず -- うま? 2015-04-14 (火) 17:16:41
  • 「それぞれの視聴時間を別テーブルに保存」って,どういうこと?解答例で split を使っているのがまさにそれでは? -- 河童の屁は,河童にあらず,屁である。? 2015-04-14 (火) 19:08:57
  • データフレームの名前をaとして、
    > (t4person <- aggregate(視聴時間 ~ 性別 + 識別ID, data = a, FUN = sum))
       性別 識別ID 視聴時間
    1   men      A        6
    2   men      B       22
    3 women      C       17
    4 women      D       10
    > (tsum4sex <- aggregate(視聴時間 ~ 性別, data = t4person, FUN = sum))
       性別 視聴時間
    1   men       28
    2 women       27
    > (tmean4sex <- aggregate(視聴時間 ~ 性別, data = t4person, FUN = mean))
       性別 視聴時間
    1   men     14.0
    2 women     13.5
     -- 名無し? 2015-04-14 (火) 21:42:51

パッケージのロード情報をワークスペースに保存出来るでしょうか?

ぺぃにゃん? (2015-04-11 (土) 14:54:36)

お世話になります。

RGuiのコンソール画面で幾つかパッケージを呼び出して作業を行い、途中で作業を終え一旦終了する際にワークスペースの保存を選択すると次回起動時にオブジェクトの情報が再現されそこから作業を再開する事が出来ます。

この時それまで使用していたパッケージもロード済みの状態で作業が再開出来ると面倒がなくて良いのですが何かいい方法はございますでしょうか?

保存する際にオプションがある、もしくはパッケージの情報は別で保存しておいて別のコマンドで一気に呼び出してロードするなどございましたらご示唆よろしくお願いします。

  • いつも同じことをやるなら,.Rprofile に library(hogehoge) とか,そのほかいつもやることを書いておけばよいのでは?ようするに,R は起動したらと言うか起動する前に .Rprofile に書いてあることをやるということ。
    必要がなくなったら .Rprofile を書き直しておく(元に戻す)。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-11 (土) 19:16:56

関数内での変数の指定について

かず? (2015-04-11 (土) 13:53:34)

お世話になります.
自作関数内で,nlmeパッケージのgls関数を呼び出したいのですが,

library(nlme)
myfunc <- function(data, y, group, time, id, cov) {
  outcome <- deparse(substitute(y))
  group <- deparse(substitute(group))
  time <- deparse(substitute(time))
  cov <- deparse(substitute(cov))
  form <- paste(outcome,'~ as.factor(', group,')+as.factor(',time,')+as.factor(',
                group,'):as.factor(',time,')',cov)
  id <- deparse(substitute(id))
  res <- gls(as.formula(form),
            data=data, corr=corSymm(form=~1|id), 
            weights=varIdent(form=~1|time))
  return(res)
}

myfunc(BodyWeight,weight,Diet,Time,Rat, )

上記の実行で,

gls(weight~Time+Diet,
    data=BodyWeight, corr=corAR1(form=~1|Rat), 
    weights=varIdent(form=~1|Time))

の結果を得ることを意図しているのですが,myfunc関数の引数であるidとtimeをmyfunc関数内でgls関数に渡す方法がわかりません.
deparse関数で文字列になってしまっているからなのかとも思いますが,そのままidと書いても駄目のようです.
ご教示のほどよろしくお願いいたします.

  • すみません,下段は,
    gls(weight~as.factor(Time)+as.factor(Diet),
        data=BodyWeight, corr=corAR1(form=~1|Rat),
        weights=varIdent(form=~1|Time))             # 投稿法を良く読むように!!!
    の間違いです.よろしくお願いいたします. -- かず? 2015-04-11 (土) 16:34:35

℃の表示

けい? (2015-04-06 (月) 15:39:48)

いつも参考にさせていただいております。
今回の質問は、温度表示の「℃」についてです。
日本語変換の「℃」では文字化けすることもありうるので、英語表現にしていますが、

lab = expression (paste("Temperature", "(", ~degreeC, ")" ))
text(0.5, 0.5, lab)

で表示させると、上付きの○部分がCと同じ大きさになってしまい、バランスが悪いです。「℃」のような表現ができればいいのですが。
○部分を小さくすることは可能でしょうか。
よろしくお願いいたします。

  • expression は expression(paste("Temperature", "(", degree, C, ")")) とかかな?Mac なら,
    deg.png
    のようにキレイに表示されるけど。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-06 (月) 16:40:03
  • Windowsでも問題ないようです。ありがとうございました。 -- けい? 2015-04-06 (月) 20:38:59

2軸のグラフ作成

TGI? (2015-04-06 (月) 08:25:40)


stripchart()の右側のy軸に異なる目盛を作り、abline()で線を追加したいのですが、以下のように実行すると右側のy軸の範囲が左側のy軸の範囲に設定されてしまいます。

y <- -10:9
x <- factor(rep(1:2, 10))
stripchart(y~x, vertical=TRUE)
abline(h=3, col="red", lwd=2, lty="solid", ylim=c(0,10), xaxt="n", yaxt="n")
axis(side=4, at=seq(0, 10, by=2))

そこで、以下のようにabline()の前にstripchart()でプロットを仮作成するとうまくいくのですが、もっとスマートな方法はないでしょうか。

y <- -10:9
x <- factor(rep(1:2, 10))
stripchart(y~x, vertical=TRUE)
par(new=TRUE)
stripchart(0, xaxt="n", yaxt="n", ylim=c(0, 10), col="white")
abline(h=3, col="red", lwd=2, lty="solid", ylim=c(0, 10), xaxt="n", yaxt="n")
axis(side=4, at=seq(0, 10, by=2))

宜しくお願いします。

  • 2軸のグラフは,普通は,2 つ(以上)のデータを同じ図に描き込むために使われるので,使い方としては後者のようにグラフ描画関数を par(new=TRUE) を挟んで 2 回使うのがまともな方法です。例示されたプログラムは,もう一つのやり方です。グラフの左と右に描かれる縦軸をそれぞれ u,v とすると,u の -10 〜 9 の目盛りは v の 0 〜 10 に対応する訳です。ということは v の目盛りを描くには,at=seq(-10, 9, length=11) の位置に, labels=0:10 という数値を描くことになります。次に,v の目盛りの 3 の位置に水平線を描くわけですが,このグラフの縦軸は -10 〜 9 であって,0 〜 10 ではないのですから,v が 3 になるような u はいくつかを逆算しないといけません。u と v の関係式は,v = (10*u+100)/19 ですから,v に 3 を代入して u = (19*3-100)/10 となるので,abline では,h=(57-100)/10 を指定することになる訳です。
    というわけで,まとめると以下のようなプログラムになるでしょう。なお,abline の引数に ylim, xaxt, yaxt が指定されていますが,(試行錯誤の結果が残っているのでしょうが,)abline の引数としては意味を持ちません。
    y <- -10:9
    x <- factor(rep(1:2, 10))
    stripchart(y~x, vertical=TRUE)
    abline(h=(57-100)/10, col="red", lwd=2, lty="solid")
    axis(side=4, at=seq(-10, 9, length=11), labels=0:10)
    このように,グラフの座標系と軸の座標系が一致しない場合には,いちいち換算してやらないといけないので,par(new=TRUE) を使う方法が勧められるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-06 (月) 11:38:33
  • ご回答ありがとうございました。換算するのはめんどくさいので、素直にpar(new=TRUE) を使うことにします。 -- TGI? 2015-04-06 (月) 13:17:15

dataframeの一行削除について

help? (2015-04-05 (日) 10:17:32)

初歩的な質問で申し訳ありません.

例えば,irisであれば,iris[,-1]とすれば,一列目が削除されたデータフレームができます.
これは行につても使えると,どこかで書いたあった記憶があるので,iris[-1,]としても1行目が消えません.そこで,例えば,miris=as.matrix(iris)とやってからmirisに同じことをやると一行目が消えます.dataframeには[-1,]の手法が使えないのでしょうか.

  • 大変お騒がせしました.一行消えていました.indexがデータ行数だと勘違いしました.申し訳ありません. -- help? 2015-04-05 (日) 11:42:43

beeswarm()について

8? (2015-04-03 (金) 09:16:24)

お世話になります。beeswarm()を使用しているのですが、以下のようにサンプル数に応じて出力する画像ファイルを大きくすると、グラフ枠から最初と最後のサンプルまでの横軸方向のスペースが大きくなってしまいます。

library(beeswarm)

pdf(file="iris.pdf",width=5,height=7)
beeswarm(Sepal.Length~Species, iris)
dev.off()

iris2 <- rbind(iris,iris,iris,iris,iris)
iris2[5] <- rep(c(letters,LETTERS),100)[1:nrow(iris2)]
pdf(file="iris2.pdf",width=35,height=7)
beeswarm(Sepal.Length~Species, iris2)
dev.off()

サンプル.png
このスペースを小さくするにはどうしたらよいでしょうか。環境はR 3.1.2のwindows 7です。
宜しくお願いします。

  • 例えば、glim = c(2,52)をbeeswarm()に追加するとどうなりますか? -- 2015-04-03 (金) 10:49:33
  • ありがとうございます。c(2,52)ではグラフ右端にスペースが残りましたが、c(2,51)とすることで希望するグラフになりました。c(2,クラス数-1)にするとよさそうです。 -- 8? 2015-04-03 (金) 11:37:24
  • ヘルプファイルを読んだのですが、"dlim and glim can be used to specify limits of the axes instead of xlim or ylim"とあります。x軸の調整はdlimのはずなのに、glimでこのような挙動をするのはなぜでしょうか。 -- 8? 2015-04-03 (金) 17:04:33
  • beeswarm:::beeswarm.default でソースを読めば解決するでしょう。horizontal か vertical かで,割り当てが変わります。vertical のときは,glim が xlim に対応するからです。 -- 河童の屁は,河童にあらず,屁である。? 2015-04-03 (金) 17:15:39
       if (horizontal) {
           if (is.null(ylim)) 
               ylim <- glim
           if (is.null(xlim)) {
               xlim <- dlim
           }
           略
       }
       else { # vertical
           if (is.null(xlim)) 
               xlim <- glim
           if (is.null(ylim)) {
               ylim <- dlim
           }
           略
       }
  • なるほど。少し不親切なヘルプファイルですね。ありがとうございました。 -- 8? 2015-04-03 (金) 19:48:22
  • http://www.cbs.dtu.dk/~eklund/beeswarm/ にコメントの送り先が明記されていますから、ヘルプファイルの修正を提案されてはいかがでしょうか -- 2015-04-05 (日) 13:59:52

カイ二乗値がとても大きい時のpchisq()

NNDDMMCC? (2015-03-31 (火) 19:35:51)

お世話になります。
カイ二乗値がとても大きい時に「1-pchisq」を計算すると,0と表示されてしまいますが,それを1.0e-20といったように,表示する方法はありますでしょうか?具体的には,

> 1-pchisq(70,1)
[1] 1.110223e-16 #1.0e-16まではしっかりと表示されますが
> 1-pchisq(71,1)
[1] 0 #それより小さくなるとすべて0になってしまうようです。

といったことを解消したいのですが,どうぞよろしくお願いいたします。

  • この種の悪例は,統計手法や R の解説を名乗っている Web ページでもよく見られます(嘆かわしいことです)。
    「丸め誤差」のせいなのですが,真の解決策を見いだすのは,オンラインヘルプを良く読むこと。p* 関数には lower.tail という引数があります。
    1-pchisq(...) ではなく,pchisq(..., lower.tail=FALSE) を使うべきなのです。
    > 1-pchisq(70, 1) # 「しっかりと表示されますが」とはいうものの,正確な値ではないのです。
    [1] 1.110223e-16
    > pchisq(70, 1, lower.tail=FALSE) # このようにすれば,正確な値が表示されます。
    [1] 5.930446e-17
    > 1-pchisq(71, 1)
    [1] 0
    > pchisq(71, 1, lower.tail=FALSE) # このような場合についても同じです。
    [1] 3.572249e-17
    もっとも,検定に対して用いる場合は,P 値はせいぜい小数点以下 3 桁までで十分なので,*e-8 だろうと,*e-11 だろうと,問題はないのですけどね。
    しかし,正しいものは正しい,間違っているものは間違っている。ちゃんとした結果を表示するすべは知っておくべし。
    pchisq.test などのソースを見ると,p-value を計算するときには,かならず pchisq(..., lower.tail=FALSE) としているのが確認出来るでしょう。-- 河童の屁は,河童にあらず,屁である。? 2015-03-31 (火) 20:41:07
  • 大変勉強になりました。どうもありがとうございました。 -- NNDDMMCC? 2015-03-31 (火) 21:28:46

ネット上のデータを大量にRに取り込む方法

たかし? (2015-03-29 (日) 13:44:17)

以下のURLは今月の3月4日に行われた競輪のレースの出走表です。
http://keirin-station.com/keirindb/race/member/36/20150304/1/
この出走表から個々の選手の競争得点の標本分散を計算します。
次に以下のURLはその結果です。
http://keirin-station.com/keirindb/race/result/36/20150304/1/
ここから3連単の配当金をとってきます。
見たい関係は競争得点の標本分散と3連単の配当金なのですが、この2つの数の組を同様に違うレースから約300レースとってきたいのですが、これらはこのホームページの出走表にいちいちアクセスしてとってくるしか方法がないのでしょうか?何か効率的なやり方はありますか?

  • 300回もページを参照されるのは(失敗なんかあったら更に同じページを何回も)サーバーとしては「なんだかなあ」ということにもなるかも。関連ページを一括ダウンロードして,アクセスはダウンロードを保存した自分のパソコンという風にすれば,お互いハッピーなんじゃないかな? -- 河童の屁は,河童にあらず,屁である。? 2015-03-29 (日) 14:14:33

lapply()の返り値について

XXX? (2015-03-27 (金) 18:10:29)

お世話になります。lapply()に自作の関数を渡して処理をする際に、返り値が画面に表示されないようにしたいのですが、invisible()が機能しないようです。

mysum <- function(x) {
	invisible(a <- sum(x))
}

x <- 1:5
mysum(x) # 返り値は表示されない

x <- c(list(1:5), list(2:6))
lapply(x, mysum) # 返り値が表示されてしまう

どのようにすればよいでしょうか。
宜しくお願いします。

  • 本来,invisible を使うのは,関数単独で引用されたときの出力を防ぐだけで,返されるオブジェクトを後で利用するためには,変数に代入するようにプログラムされる。その意味では invisible であろうと return であろうと変わりはない。関数の結果を暗黙的に表示もしないし変数にも代入しないというのは意味不明である。
    では,invisible は何のためにあるか。それは,不用意に関数をむき出しで引用して,たくさんの訳のわからない(?)数値の出力の嵐に見舞われるより,何にも出力せずにおいて,「ああ,代入してからその後で別の関数に引き渡さないととダメなんだなあ」とプログラマに反省を促す意味があるんだろうかなぁ。
    プログラムには他にもいろいろ改良点があるが。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-27 (金) 20:48:18
    mysum <- function(x) {
    	invisible(sum(x)) # 代入してから返す必要はない
    }
    
    x <- 1:5
    mysum(x) # 返り値は表示されない
    
    x <- list(1:5, 2:6)   # データ構造としてはこちらが自然(ベクトルを要素として持つリスト)
    y <- sapply(x, mysum) # この場合は sapply がよいだろう。
                          # 結果を何かに代入してやればよいだけ(そういう意味では invisible ではなく return で十分)
                          # そもそも,代入もしない,出力もしないというのでは,何のための関数?
                          # 回避策があるなら,不本意でもそれを使う
    y # 必要なときに表示すればよいだけ(不要なら表示しないだけ)
  • ありがとうございました。代入すればよいだけだったのですね。サンプルコードを簡潔にしすぎて変な質問になっていました。実際には関数内で代入します。 -- XXX? 2015-03-28 (土) 01:28:07

日本語が急に文字化けするようになりました

月野? (2015-03-25 (水) 14:45:04)

初めて投稿させていただきます。win7 64bitで、R3.1.2を使用していたところ、先日突然、コンソールのメッセージが全て英語になり、日本語を入力しても文字化けするようになってしまいました。これまで対応として試みたのは

・Rconsole 内の のlanguage = ja_JP.UTF-8 に上書き
・Sys.setenv での変更

> Sys.setenv(LANG = "fr")
> x
Erreur : objet 'x' introuvable
> Sys.setenv(LANG = "ja_JP.UTF-8")
> x
Error: object 'x' not found
> Sys.setenv(LANG = "en")
> x
Error: object 'x' not found

になります。R3.1.3をインストールしても同じ症状が継続して出ています。対処方法を御教示いただけますでしょうか。よろしくお願いします。

  • 「コンソールのメッセージが全て英語になり」というのと「日本語を入れても文字化け」というのは同じ原因かなぁ。前者については,R コンソールのメニューバーの Edit --> GUI preferences... で出てくる設定ウインドウの Language for menus and messages の欄に何か入っていませんか? en だと英語,fr だとフランス語,ja または空白だと日本語になるようですが。
    設定後,Save... して一度 R を終了後,再度 R を立ち上げてみてください。
    私の環境では,原因と対策は上のようなことかなと... -- 河童の屁は,河童にあらず,屁である。? 2015-03-25 (水) 15:32:33
  • 河童の屁は,河童にあらず,屁である。さま ありがとうございます。設定ウィンドウの該当箇所は空欄です。そこに ja_JP.UTF-8 と 入力してsaveし、Rconsole ファイルを上書き。Rの再立ち上げをしても症状は変わらずです。 -- 月野? 2015-03-25 (水) 15:45:00
  • そうですか。その欄に fr と書いても,メッセージはフランス語で出るけど,日本語は変数名などでも使えますから,別の原因なんでしょうね。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-25 (水) 15:49:33
  • ありがとうございます。素人ながら3.1.3をインストールしても症状が継承されることから、どこか大元の設定が変わってしまったような気がしています。日本語の列名の書かれたファイルを使わざるを得ないので困り果てています。。 -- 月野? 2015-03-25 (水) 15:58:13
  • そもそもWindowsなのに、ja_JP.CP932じゃなくてja_JP.UTF-8を設定しているのは、何か特別の理由があるのでしょうか。
    とりあえず、まだ試していないのなら下記を試してみて。 -- 2015-03-25 (水) 18:26:56
    > Sys.setlocale(locale="Japanese")
  • ありがとうございます。UTF-8を指定したのは特別な理由はないです。webで調べた例がUnixの例でしたがそのまま真似したまででした。また、文字コードについての理解が足りないようで申し訳ございません。取り急ぎ以下をやってみました。御助言よろしくお願い致します。 -- 月野? 2015-03-26 (木) 10:21:36
    # 実行結果などをどのように記述するかは,他の投稿記事をみるとか,投稿書式についての説明を読むとかしてほしいものです
    > Sys.setlocale(locale="Japanese")
    [1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;
         LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932" 
    > Sys.setenv(LANG = "Japanese_Japan.932") 
    > x  Error: object 'x' not found
  • 「object 'x' not found」の意味は「xという名前のRオブジェクトは存在しない」という意味です。文字化けとか日本語に全く関係がありません。どのようなローケルで設定してあったとしても、ないものはないのです。そこがトラブルシューティングの出発点だと思いますよ。 -- 2015-03-26 (木) 15:21:45
  • ↑ そうじゃなくて,「日本語でのエラーメッセージじゃなく英語のエラーメッセージが出るようになった」って言っているのよ -- 2015-03-26 (木) 15:47:32
  • メッセージの問題への対処だけでは本質な解決につながらないと思うが、メッセージの設定はLC_MESSAGESだよ。Sys.getenv()で確認してみて。それから、--vanillaをつけてRを起動するとどうなりますか? -- 2015-03-26 (木) 16:45:10
  • ありがとうございます。Sys.getenv()を見てみましたが、Rに直接関係しそうなのは > "R_ARCH","/x64" > "R_HOME","C:/PROGRA~1/R/R-31~1.2" > "R_LIBS_USER","C:\Users\moon\Documents/R/win-library/3.1" > "R_USER","C:\Users\moon\Documents" のみでした(全体は60行程度あるので省略しました。必要であればご指示ください)。LC_MESSAGES やMESSAGESに該当する記述は見当たりませんでした。また、cmdで、Rgui.exe および R.exe を ---vanillaをつけて起動してみましたが、英語のスタート画面がでるだけでした。御助言よろしくお願い致します。 -- 月野? 2015-03-27 (金) 14:46:53
  • えっと、
    1.「コントロール パネル\時計、言語、および地域」の「管理」タブ内の「Unicode対応ではないプログラムの言語」が「日本語(日本)」になってるか確認.
    2.「C:\Program Files\R\R-3.1.3\etc\Rconsole」の中のlanguage = が無指定(ブランク)か確認.
    3. ご自分の「C:\Users\<ユーザー名>\Documents\Rconsole」の中のlanguage = が無指定(ブランク)か確認.
    4. 上記が問題なければ普通にRを起動して、sessionInfo()の結果をはりつける.
     > sessionInfo()
    5. cmdを実行して環境変数の一覧を取得してはりつける.
    C:\xxxx> set > env.txt
    そんなもんかぁ -- なかま 2015-03-27 (金) 16:09:40
  • なかま さま ありがとうございます。1は問題ありませんでしたが、「形式」タブ内の「形式」が、英語になっていたところを、「日本語(日本)」に変更したところ、症状が解消しました。ありがとうございました。 -- 月野? 2015-03-27 (金) 19:18:38

重回帰(lm)でのpredictの使い方について

NwFc? (2015-03-22 (日) 20:48:16)

初めて投稿させて頂きます.ルールが余りわからず失礼があればお許しください. ← プログラム等をどうやって入力するか,ソースを見るべし

Rで重回帰をしようとして,予測のところで躓いています.初歩的な理解不足と思いますが,どなたか,私が何を勘違いしているかを御教え頂けると嬉しいです.
やりたいことはデータを与えてlmで重回帰式求め,新しいデータでyを予測するというものです.単回帰の場合はうまくいくのですが,説明変数xを二つにすると,predictで素直に計算してくれず,元データの行数と合わないなとど,警告がでます.xの一組のペア(50,50)でyを予測してほしいだけなのですが.
 predictは重回帰では使えず,係数を求めて自分でベクトル演算するしかないのでしょうか? どなたか助けてください.

> x1 <- c(30, 20, 60, 80, 40, 50, 60, 30, 70, 60)
> x2 <- c(30, 50, 60, 80, 40, 30, 60, 30, 40, 60)
> x <- cbind(x1, x2)
> a <- as.matrix(c(2, 5))
> y <- x %*% a
> 
> z <- lm(y ~ x)
> new <- data.frame(x1 = 50, x2 = 50)
> predict(z, new)
  1   2   3   4   5   6   7   8   9  10 
210 290 420 560 280 250 420 210 340 420 
Warning message:
'newdata' had 1 row but variables found have 10 rows
  • そもそもモデル式が間違っているのでは? -- 2015-03-23 (月) 03:54:16
    > z <- lm(y ~ x1 + x2)
    > new <- data.frame(x1 = 50, x2 = 50)
    > predict(z, new)
      1 
    350 
    なお、yは次のように作成すると1行ですむ。y, x1, x2だけあればy ~ x1 + x2の回帰分析ができるので、xは不要。
    > y <- 2 * x1 + 5 * x2
  • 早速、ご回答を頂き有難う御座います。 -- NwFc? 2015-03-24 (火) 11:43:20

リストの要素の削除について

Lee? (2015-03-17 (火) 20:05:19)

たびたびすみません。再び質問させて頂きます。 # 「すいません」などという日本語はありません
複数の文字列を要素にもつリストxから、文字列ベクトルyの要素を削除して、リストzを作りたいと考えています。

(x <- list(c("Aaa","Abb","Acc"), c("Baa","Bcc","Bds","Bas"), c("dsfa","fgsd","gtsd","frgh")))
y <- c("Acc", "fgsd")
(z <- list(c("Aaa","Abb"), c("Baa","Bcc","Bds","Bas"), c("dsfa","gtsd","frgh")))

どのような処理をすれば可能でしょうか。使えそうな関数でもよいので教えて頂けませんか。
宜しくお願いします。

  • これも,基本的な関数の組み合わせで実現できます。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-17 (火) 21:49:16
    > z # このような結果が欲しいのですね
    [[1]]
    [1] "Aaa" "Abb"
    
    [[2]]
    [1] "Baa" "Bcc" "Bds" "Bas"
    
    [[3]]
    [1] "dsfa" "gtsd" "frgh"
    
    > lapply(x, function(a) a[!(a %in% y)]) # プログラムは,この一行で十分 ! の後に( )を余分につけた
    [[1]]
    [1] "Aaa" "Abb"
    
    [[2]]
    [1] "Baa" "Bcc" "Bds" "Bas"
    
    [[3]]
    [1] "dsfa" "gtsd" "frgh"
  • ありがとうござました。apply系の関数に自作の関数を組み合わせる使い方に慣れていないので勉強になりました。 私の目的とは異なりますが、もし文字ベクトルyがy <- c("Ac", "fgs")であり、yを部分文字列にもつxの要素を除去し、同様のzを得る場合はどのようにすべきでしょうか。lapplyとgrepを組み合わせればできるような気がするのですが、後学のために教えて頂けませんか。 -- Lee? 2015-03-18 (水) 08:26:30
  • lapply(x, function(a) a[! apply(sapply(y, function(b) grepl(b, a)), 1, any)]) ですかね。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-18 (水) 11:27:17
  • ありがとうございました。挙動を確認し、ようやく理解できました。apply系の関数を組み合わせれば、複雑な処理でも1行で済むのですね。 -- Lee? 2015-03-18 (水) 14:04:20

リストの要素の結合について

Lee? (2015-03-16 (月) 15:47:44)

お世話になります。

以下のような2×3の行列を要素にもつリストがあり、rbindで6×3の行列にします。

list_dat <- list(matrix(1:6, nrow=2, ncol=3),matrix(7:12, nrow=2, ncol=3),matrix(13:18, nrow=2, ncol=3))
rbind(list_dat[[1]],list_dat[[2]],list_dat[[3]])


本当のデータはもっとたくさんの要素を持つので、この処理をlapply()やsapply()で実行しようとしたのですが結合した行列が作れません。どのようにすればよいでしょうか。

よろしくお願いします。

  • Reduce()はどうですか? -- 2015-03-16 (月) 17:26:02
    > Reduce(rbind, list_dat)
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    [3,]    7    9   11
    [4,]    8   10   12
    [5,]   13   15   17
    [6,]   14   16   18
  • 見たことも聞いたこともない関数を使わなくても,基本的な機能を使いこなして目的を達するのが真の R 使いかも。以下のプログラムは,NULL を初期値として持つオブジェクトに,リストの中の行列オブジェクトを次々に rbind していくというものです。ノートに手書きでいくつかの行列をまとめた結果を書く手順と全く同じでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-16 (月) 17:52:29
    > result = NULL
    > for (i in list_dat) {
    +   result <- rbind(result, i)
    + }
    > result
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    [3,]    7    9   11
    [4,]    8   10   12
    [5,]   13   15   17
    [6,]   14   16   18
  • Reduce()を薦めた者ですけど、baseパッケージの中の基本関数を「見たことも聞いたこともない」とは、あんまりです > 河童さん -- 2015-03-16 (月) 18:35:15
  • ありがとうございました。Reduce()は初めて知りました。調べたところ、do.call()でも同様の処理ができるのですね。確かにfor文を使えばできるのですが、こちらのwikiではfor文ではなくapply系の関数で処理するほうが推奨されているように思えたので質問しました。 -- Lee? 2015-03-16 (月) 18:42:52
  • 「見たことも聞いたこともない」のは,私ではありません。
    質問して,解答をもらえるまでの時間と,for 文でシコシコ回す簡単なプログラムの計算時間とどちらが速いでしょうか。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-16 (月) 18:53:26

検定ベクトル処理のためのチェイン構文+doの仕様方法について

コバヤシカズオ? (2015-03-12 (木) 16:33:43)

お世話になります。グループ毎にoneway.testを実行したく,下記例を
インターネットで見つけました。
 data %>% group_by(AAA,BBB) %>% do(hensu=lm(Y~X,data=.))
真似をして,下記で実行したところエラーとなりました。
 data %>% group_by(CCC) %>% do(oneway=oneway.test(YY~XX,deta=.))

Error in oneway.test(YY~XX, data= .SD) : not enough groups

CCCの中に複数のカテゴリー(文字)は確認しました。
基本的な使用方法の間違いでしょうか。ご指導戴けると幸いです。R3.1.2 Windows8

  • 申し訳ありません。doの使用方法について でした。 -- コバヤシカズオ? 2015-03-12 (木) 16:36:12
  • 私は、この妙なやりかたはまったく知らないのだけど、エラーメッセージの意味は、Xに問題があると言っているのだと思います。
    辛口ではありますが,本質を知らずまねだけしても,まねにもならないと思います。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-13 (金) 01:28:52
  • %>% や, group_by や,do は標準関数ではありませんので(便利なのでいま流行っていますが),ちゃんと書いてください.dplyrとmagrittr パッケージがあることが前提ですよね.それで,not enough groups はoneway.testが出しているメッセージで,一元配置分散分析はグループごとに平均値に差があるという帰無仮説を検定するものですが,グループの数が足りないという意味です.group_byを通しているので,CCCごとに層別してできた層のうちのどれかに,XXが1種類しか含まれない層ができてしまったのだろうと思います. data %>% group_by(CCC) %>% summarise(n_distinct(XX)) のように,各CCC層のXXが2以上あるかどうかを確認すべきでしょうね -- 2015-03-13 (金) 23:48:17
  • 皆様 返信が遅く大変申し訳ありません。全グループが2水準以上であることが必要と思い至りませんでした。読み込みパッケージ未記載についても申し訳ありません。助言戴きありがとうございます。 -- コバヤシカズオ? 2015-03-17 (火) 09:55:24

データフレームからベクトルへの変換

FK? (2015-03-12 (木) 09:49:07)

お世話になります。以下のようなデータフレームxの要素をひとつのベクトルに変換したいのですが、何かよい方法はないでしょうか。要素の順番はどうでも構いません。as.vector()ではできませんでした。

宜しくお願いします。

sex <- c("F","F","M","M","M")
height <- c(158,162,177,173,166)
weight <- c(51,55,72,57,64)
( x <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight) )
  • unlist(x)は試してみましたか -- 竹澤? 2015-03-12 (木) 10:34:49
  • unlist(x)をすると"F", "M"が"1","2"に変換されてしまいました。 -- FK? 2015-03-12 (木) 10:41:26
  • 意図を掴みにくいですが、因子型のFやMが1や2になっては困るということは、全ての文字列でという要望ですね。 -- 2015-03-12 (木) 10:58:48
    > x$SEX <- as.character(x$SEX)
    > unlist(x)
       SEX1    SEX2    SEX3    SEX4    SEX5 HEIGHT1 HEIGHT2 HEIGHT3 HEIGHT4 HEIGHT5 
        "F"     "F"     "M"     "M"     "M"   "158"   "162"   "177"   "173"   "166" 
    WEIGHT1 WEIGHT2 WEIGHT3 WEIGHT4 WEIGHT5 
      "51"    "55"    "72"    "57"    "64" 
    名前付きベクトルが嫌であればunname()を使えばいいです
    > unname(unlist(x))
     [1] "F"   "F"   "M"   "M"   "M"   "158" "162" "177" "173" "166" "51"  "55" 
    [13] "72"  "57"  "64"
  • 希望する処理ができました。ありがとうございました。 -- FK? 2015-03-12 (木) 13:05:41

decompose関数について

okh? (2015-03-10 (火) 11:28:18)

統計数理研究所のDecompとRのdecompose関数は同じ計算法なんでしょうか?最近出版された「楽しいR」という本の59ページを読んでいて気になったのですが。どなたか知ってますでしょうか。


「Wiki内のGoogle検索について」など2件

Montecarlo? (2015-03-08 (日) 22:56:02)

いつもお世話になっております。

質問が2件ありますので、お答えいただけたら幸いです。

・Wiki内検索について
本Wiki内の検索を一番下のGoogle検索窓からWiki内を検索しましたが
いくつか「有効なWikiNameではありません」と表示されて、検索がうまくいっていないようです。
この解決策をご存知の方がいらっしゃいましたら、教えていただけたらと思います。

・画像の添付について
トップページには以下のように書かれていました。
> 各ページへのファイル添付については、ページ上部の「ファイル添付」より、画像ファイルのみユーザー認証なしで可能としてあります。その他のファイルの添付はユーザー認証することで可能です。
しかしながら、添付しようとすると「管理者パスワードが一致しません。」と出てしまい、添付ができませんでした。
添付の具体的な方法を教えていただけたらと思います。

よろしくお願いいたします。

  • 検索は,ページ上部の「単語検索」でやるとよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-08 (日) 23:32:43
  • Googleの検索が失敗する理由は、ごく最近このWikiシステムの文字コードをeuc-jpからutf-8に変更したためです(違ったら訂正して下さい岡田先生)。そのため、Googleのデータベース内の古いURLが空振りになっており、徐々に新しいURLに置き換わってくると思います。Google内の更新速度がどの程度か知らないですが。解決策は河童さんの助言通りです。画像以外のファイルの添付は、自分のサイトに当該ファイルを置いて、そのURLを書き込まれるのも、1つの解決策だと思います。 -- 2015-03-09 (月) 12:50:08
  • Google検索が失敗する理由はおそらくご指摘の通りだと思っており、時間がたつと解決することを期待しています。画像添付は許可するよう修正が必要ですね。しばらくお待ちください。 -- 岡田 2015-03-09 (月) 17:43:19
  • 添付ファイルを管理者パスワードなしで許可するように設定変更しました。 -- 岡田 2015-03-10 (火) 12:28:13
  • 返信遅くなってしまい、申し訳ありませんでした。
    そして、返信いただきありがとうございました。
    Google検索はしばらく時間がかかるようなので、「単語検索」で行いたいと思います。 画像添付は機会を得たら、その時に添付したいと思います。 -- Montecarlo? 2015-03-10 (火) 23:00:03

meta packageでのp値の桁数

NNDDMMCC? (2015-03-04 (水) 14:15:42)

お世話になります。
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
OS:windouws 7
でメタ解析をmeta packageを用いて行っております。
そのなかで,metabinを用いて以下のようなプログラムを実行しました。

X <- matrix(c(1282, 1890, 1368, 2426, 1749, 2606, 1462, 2536), 2, 4, byrow=TRUE)
res <- metabin(X[,1], X[,2], X[,3], X[,4], sm="OR", comb.fixed=TRUE)
res$pval.fixed

としてfixed effect modelのp値を表示しようとしたのですですが,数字が小さすぎて"0"と表示されてしまいます。
とても小さい値(おそらく1.0E-16以下だと思います)を表示するにはどうすればよろしいでしょうか。
どうぞよろしくお願いいたします。

  • 変数の内容を 2 進数表記するとどのようになるかを確認してみるには,以下のようにすればよいでしょう。
    > sprintf("%A", res$pval.fixed)
    [1] "0X0P+0"
    > sprintf("%A", 0)
    [1] "0X0P+0"
    なので,これは正真正銘の 0 ですね。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-04 (水) 14:42:34
  • ご回答ありがとうございます。sprintf関数,勉強になりました。ありがとうございました。 -- NNDDMMCC? 2015-03-04 (水) 19:51:26

自分で定義した関数中でstepが使えない

HA? (2015-02-28 (土) 21:57:05)

お世話になります。
Rを始めて3ヶ月、プログラミングはRが初めて、という者です。
環境は 
R version 3.1.2 (2014-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
OS:Windows 7 professional
です。
アンケートの分析で、ロジット(将来的にはプロビットも)分析を行い、step関数のステップワイズ法で変数選択をしようとしています。
目的変数にあたる項目が複数あり、将来的に似たような分析をすることなどから、一連の操作を一つの関数にまとめておきたいと考えました。
そして以下のような関数を作りました(エラーに関係しない部分は省いております)

y = runif(100) > 0.3  #テストデータ
x1 = runif(100)
x2 = runif(100)
x3 = runif(100)
x4 = runif(100)
t.d = data.frame(y,x1,x2,x3,x4)
obj = y~.
null = y~ 1

t.func = function(obj, null, family = binomial,  #関数本体
                 data, direction = "both"){
 on.exit(sink())
 sink("test.txt")
 rg1 = glm(obj,family ,data)
 rg2 = glm(null,family ,data)
 step(rg1, scope = list(upper = rg1, lower = rg2), 
      direction = direction)
}
t.func(obj, null,data = t.d)

これを実行すると、

「Error in UseMethod("family") : 
  no applicable method for 'family' applied to an object of class "NULL"」

というエラーメッセージが出て、停止してしまいます。
1行ずつreturnで結果を返していったところ、stepの部分でエラーが出ているようなのですが、familyはstepの引数に含まれていないので、どうすればいいのか見当がつきません。
directionを"backward"にすれば動くのですが、できればステップワイズ法(direction = "both")でも結果を得たいと考えています。
本サイトでは、glmで検索した結果と「Rの関数定義の基本」については目を通しましたが、解決に繋がると理解できるものはありませんでした。
(「Rの関数定義の基本」の「引数として関数オブジェクトを与える場合」は関連するかと思ったのですが、理解できませんでした)
どうかご助言よろしくお願いいたします。

  • 誰の回答もないのでコメントだけ。質問のエラーは再現します。step()の箇所は、関数の中ではなく、外だと正常に動作するのでnamespaceがらみのstep()のバグ(と言うか関数内で使用されるケースを十分に検証していない)である気がします。MASSパッケージのstepAIC()に代えても同じですね。 -- 2015-03-03 (火) 10:09:56
  • コメントありがとうございます。namespaceというのは初見でして、初心者には荷が重そうです。。簡単に直せないということが分かっただけでも収穫でした。他の方法を考えてみます。 -- HA? 2015-03-03 (火) 20:46:55
  • 関数の作り方に難がある(ちょっと癖がある)ので,以下のような関数仕様にすると動くと思います。もっとも,最終結果しか書かれないですけど。
    もっとも,こんな簡単な関数になるなら,わざわざ関数にする必要はなく,その都度 step を直接呼ぶだけでよいので,何の問題も生じないのだが?? -- 河童の屁は,河童にあらず,屁である。? 2015-03-03 (火) 21:42:17
    set.seed(20206)
    n = 40
    y = runif(n) > 0.3  #テストデータ
    x1 = rnorm(n)
    x2 = rnorm(n)
    x3 = rnorm(n)
    x4 = rnorm(n)
    t.d = data.frame(y, x1, x2, x3, x4)
    
    t.func = function(y, x, family = binomial, direction = "both") {
      on.exit(sink())
      sink("test.txt")
      rg1 = glm(y ~ x, family)
      step(rg1, direction = direction) # モデルの範囲を指定する必要はないと思われるので
    }
    
    t.func(t.d[,1], as.matrix(t.d[2:5])) # 第1引数は従属変数ベクトル,第2引数は独立変数行列,第3以降はf amily, direction を指定できる
  • 河童の屁は,河童にあらず,屁であるさん。回答ありがとうございます。

    まず報告ですが、残念ながらお示し頂いた方法だと、xの部分がまとめて一つの変数(?)として扱われていて、最後の結果だけが示されているというよりも、全ての変数を利用したモデルと定数項のみのモデルだけで比較しているようです(x1だけを選択するのが最適な人工データで実験済み。出力結果を見てもxの自由度が4になっています)。

    ちなみに質問に際して他に省いた部分はファイルの名前の管理に関する部分でした。
    1.複数の目的変数があり、合成変数も作っていたり、地域毎に見たいなどの理由で、
    分析したいデータセットの種類が結構あり(今のところ30位を計画)、
    2.ステップワイズは定数項だけのモデルから始める場合と全変数を使うモデルから始める場合の両方を比べたかった(オプションで選べるようにして出力ファイル名にも反映)
    3.ロジットの結果をベースにしつつ余裕があればプロビットの結果とも比較したいと考えていた(これもファイル名でロジットとプロビットの区別)

    といった理由で処理と一緒に関数化したかったのですが、プログラミングの定石としては悪手でしょうか。重ねて質問ですいません。

    とりあえず、今はsourceで呼び出す形である程度処理をまとめようと考えています。-- HA? 2015-03-03 (火) 23:05:05
  • 適切なテストデータがなかったので,十分吟味できておらず,失礼しました。また,sink の存在をうっかり見過ごしていたのも,お恥ずかしい。
    さて,要するに formula の指定を引数に取るのが諸悪の根源(?)のようなので,従属変数と独立変数行列を引数で渡して,その後のことは,関数でやることにします。変数名はなんでもよい(例では従属変数名は yy です)。t.func の第1引数は 1 列のデータフレーム(例では (t.d[,1] では,ダメ!)。従属変数もデータフレーム。family を引数にするのはまた別の面倒を生じるので,binomial(link="***") の link を引数にする。実行結果中に binomial(link="probit") と明示したいなら,関数記述をちょっと工夫する。
    step 関数において,モデルの範囲を指定する必要はないと思われるが,当初のプログラムにあわせて scope 引数を含めておく。 -- 河童の屁は,河童にあらず,屁である。? 2015-03-04 (水) 09:06:54
    # seed=sample(100000, 1)
    set.seed(9475)
    # print(seed)
    n = 40
    yy = runif(n) > 0.3  #テストデータ
    x1 = rnorm(n)
    x2 = rnorm(n)
    x3 = rnorm(n)
    x4 = rnorm(n)
    t.d = data.frame(yy, x1, x2, x3, x4)
    
    t.func = function(y, x, link=c("logit", "probit"), direction = "both") {
    #  on.exit(sink())
    #  sink("test.txt")
      link = match.arg(link)
      d = data.frame(y, x)
      formula1 = as.formula(sprintf("%s ~ .", colnames(d)[1]))
      rg1 = glm(formula1, family=binomial(link=link), data=d)
      formula2 = as.formula(sprintf("%s ~ 1", colnames(d)[1]))
      rg2 = glm(formula2, family=binomial(link=link),  data=d)
      step(rg1, scope = list(upper = rg1, lower = rg2) , direction = direction)
    }
    
    t.func(t.d[1], t.d[2:5]) # 第1引数は 1 列のデータフレーム(t.d[, 1]ではない),第2引数は独立変数のデータフレーム,第3以降は link, direction を指定できる
    t.func(t.d[1], t.d[2:5], link="probit", direction="backward")
    実行例1
    >  t.func(t.d[1], t.d[2:5]) # 第1引数は...
    Start:  AIC=39.64
    yy ~ x1 + x2 + x3 + x4
    
           Df Deviance    AIC
    - x2    1   29.679 37.679
    <none>      29.636 39.636
    - x1    1   32.109 40.109
    - x4    1   35.722 43.722
    - x3    1   37.178 45.178
    
    Step:  AIC=37.68
    yy ~ x1 + x3 + x4
    
           Df Deviance    AIC
    <none>      29.679 37.679
    - x1    1   32.123 38.123
    + x2    1   29.636 39.636
    - x4    1   35.948 41.948
    - x3    1   37.239 43.239
    
    Call:  glm(formula = yy ~ x1 + x3 + x4, family = binomial(link = link), 
        data = d)
    
    Coefficients:
    (Intercept)           x1           x3           x4  
         2.1681       0.5991       1.3290      -1.4805  
    
    Degrees of Freedom: 39 Total (i.e. Null);  36 Residual
    Null Deviance:	    40.03 
    Residual Deviance: 29.68 	AIC: 37.68
    実行例2
    >  t.func(t.d[1], t.d[2:5], link="probit", direction="backward")
    Start:  AIC=40.81
    yy ~ x1 + x2 + x3 + x4
    
           Df Deviance    AIC
    - x2    1   30.815 38.815
    - x1    1   32.370 40.370
    <none>      30.813 40.813
    - x4    1   36.481 44.481
    - x3    1   37.109 45.109
    
    Step:  AIC=38.81
    yy ~ x1 + x3 + x4
    
           Df Deviance    AIC
    - x1    1   32.392 38.392
    <none>      30.815 38.815
    - x4    1   36.583 42.583
    - x3    1   37.154 43.154
    
    Step:  AIC=38.39
    yy ~ x3 + x4
    
           Df Deviance    AIC
    <none>      32.392 38.392
    - x4    1   36.744 40.744
    - x3    1   37.532 41.532
    
    Call:  glm(formula = yy ~ x3 + x4, family = binomial(link = link), data = d)
    
    Coefficients:
    (Intercept)           x3           x4  
         1.1263       0.5115      -0.5909  
    
    Degrees of Freedom: 39 Total (i.e. Null);  37 Residual
    Null Deviance:	    40.03 
    Residual Deviance: 32.39 	AIC: 38.39
  • 河童の屁は,河童にあらず,屁である。さん ありがとうございます!動作確認できました。後は自分でできそうです。formulaではなく変数名で管理すればよいのも使い勝手がよくなる気がします。 -- HA? 2015-03-04 (水) 10:42:24

引数の確認について

Montecarlo? (2015-02-22 (日) 23:37:30)

いつもお世話になっております。
今回引数の確認について質問をさせていただきます。

関数の中で関数を定義し、その関数が調べることが可能かの疑問があります。
具体的には以下の事象です。

以下のプログラムを走らせると

Dist.norm <- function(arg.m, arg.sd){
	return(
		list(
			random = function(n) rnorm(n, arg.m, arg.sd)
			, mean = arg.m
			, density = function(x) dnorm(x, arg.m, arg.sd)
		)
	)
}

TestFunction <- Dist.norm(2, 3)
TestFunction
set.seed(0);TestFunction$random(3);set.seed(0);rnorm(3, 2, 3)
TestFunction$density(0.3); dnorm(0.3, 2, 3)

このように返ってきます。

> Dist.norm <- function(arg.m, arg.sd){
+ return(
+ list(
+ random = function(n) rnorm(n, arg.m, arg.sd)
+ , mean = arg.m
+ , density = function(x) dnorm(x, arg.m, arg.sd)
+ )
+ )
+ }
> 
> TestFunction <- Dist.norm(2, 3)
> TestFunction
$random
function (n) 
rnorm(n, arg.m, arg.sd)
<environment: 0x00000000295e3d18>

$mean
[1] 2

$density
function (x) 
dnorm(x, arg.m, arg.sd)
<environment: 0x00000000295e3d18>

> set.seed(0);TestFunction$random(3);set.seed(0);rnorm(3, 2, 3)
[1] 5.788863 1.021300 5.989398
[1] 5.788863 1.021300 5.989398
> TestFunction$density(0.3); dnorm(0.3, 2, 3)
[1] 0.1132558
[1] 0.1132558

こちらが意図とした通り、乱数と平均および密度が求まっています。
しかしながら、以下の状態では「arg.m」「arg.sd」へ何が入っているかわからない状態です。

> TestFunction$random
function(n) rnorm(n, arg.m, arg.sd)
<environment: 0x00000000295e3d18>

この「arg.m」「arg.sd」を取得する方法はありますでしょうか。
具体的には、上記の例で「arg.m = 2」「arg.sd = 3」を取得したいです。

皆さんのお知恵を拝借できればと思います。
どうぞよろしくお願いいたします。

  • > この「arg.m」「arg.sd」を取得する方法はありますでしょうか。
    という意味がよくわからないのですが。arg.m, arg.sd は仮引数なので,実引数の値を取り出したい(実引数が何であったか知りたい)ということなんでしょうか?
    Dist.norm の戻り値に mean = arg.m を指定しているので,TestFunction?$mean とすれば 2 が得られているでしょう?
    だったら mean = arg.m, sd = arg.sd としておけば TestFunction?$sd とすれば 3 が得られるでしょう。
    あるいは,
    density = function(x) c(dnorm(x, arg.m, arg.sd), arg.m, arg.sd)
    というように定義しておけば,dnorm の戻り値と,arg.m, arg.sd の 3 つが戻りますけど?
    >  TestFunction$density(0.3)
    [1] 0.1132558 2.0000000 3.0000000
    c ではなく list で返してやってもよいでしょう。
    density = function(x) list(density=dnorm(x, arg.m, arg.sd), arg.m=arg.m, arg.sd=arg.sd)
    としておけば,
    >  TestFunction$density(0.3); dnorm(0.3, 2, 3)
    $density
    [1] 0.1132558
    
    $arg.m
    [1] 2
    
    $arg.sd
    [1] 3
    お好きな方を。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-23 (月) 04:18:52
  • 「 河童の屁は,河童にあらず,屁である。」様
    早速の返信ありがとうございます。
    言われてみればその通りですね。

    返り値として指定してあげればよい話ですね。
    ありがとうございました。

    -- Montecarlo? 2015-02-23 (月) 06:50:55


テーブル変形について

konoushi? (2015-02-22 (日) 17:13:59)

平素よりお世話になっております。
下記のようなテーブルを以下のように変形したいのです。
どのようにすればよいでしょうか。

id  StartYear EndYear Variable
01  2000       2002         a
02   1995      1997         b

id   Year     Variable
01   2000       a
01   2001       a
01   2002       a
02   1995       b
02   1996       b
03   1997       b   # 変なところに投稿しないように 投稿法も学習すること
  • あれこれうまい方法を聞いたり,試したりするより,ださくても簡単で確かなプログラムを書くのが,結局は速いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-22 (日) 18:55:03
    d <- structure(list(id = c(1L, 2L, 30L),
      StartYear = c(2000L, 1995L, 2010L),
      EndYear = c(2002L, 1997L, 2015L),
      Variable = structure(1:3, .Label = c("a", "b", "c"), class = "factor")),
      .Names = c("id", "StartYear", "EndYear", "Variable"), class = "data.frame",
      row.names = c(NA, -3L))
    d
    n <- d$EndYear - d$StartYear + 1
    d2 <- NULL
    for (i in 1:nrow(d)) {
      d2 <- rbind(d2,
      cbind(rep(d[i,1], n[i]),
            seq(d[i, 2], d[i, 3], length=n[i]),
            rep(as.character(d[i,4]), n[i])))
    }
    d2 <- data.frame(d2)
    colnames(d2) <- c("id", "Year", "Variable")
    d2$id <- as.integer(as.character(d2$id))
    d2$Year <- as.integer(as.character(d2$Year))
    d2
    実行結果
    > d
      id StartYear EndYear Variable
    1  1      2000    2002        a
    2  2      1995    1997        b
    3 30      2010    2015        c
    > d2
       id Year Variable
    1   1 2000        a
    2   1 2001        a
    3   1 2002        a
    4   2 1995        b
    5   2 1996        b
    6   2 1997        b
    7  30 2010        c
    8  30 2011        c
    9  30 2012        c
    10 30 2013        c
    11 30 2014        c
    12 30 2015        c

要素を一回で抽出する事は可能でしょうか?

risperidone? (2015-02-20 (金) 10:20:50)

お世話になります。例えば下記のようなデータがあったとします。
1:ANA 2:JAL 3:ANA, JAL 4:JAL,ANA, DEL
それぞれの構成要素をカウントすると、ANA 3, JAL 3, DEL 1となります。このように構成要素の数をRでカウントする手法があればご教授下さい。宜しくお願いします。

  • 1:ANA 2:JAL 3:ANA, JAL 4:JAL,ANA, DEL は1, 2, 3, 4 行目の内容ということですか? 「1:」,「2:」などは行の一部として入っているのですか?それとも,1:ANA 2:JAL 3:ANA, JAL 4:JAL,ANA, DEL 全体が 1 個の文字列なんですか?
    集計対象のデータ構造がちゃんと記述されていないと,最適の方法を提案できないですね。-- 河童の屁は,河童にあらず,屁である。? 2015-02-20 (金) 10:24:54
  • ご返信ありがとうございます。「1:」,「2:」などは行の一部として入っていません。各セルには要素が単一の場合は要素のみ、複数の場合「ANA, JAL」などと要素とカンマのみが入力されています。 -- risperidone? 2015-02-20 (金) 10:35:52
  • ファイルからどのようにして読み込んだのですか?つまり,対象は data.frame なのか,ベクトルなのか?
    ANA
    JAL
    ANA, JAL
    JAL,ANA, DEL
    のようなファイル(test.dat)があって,それを readLines で読み込んだ場合ならば,
    x <- readLines("test.dat")
    table(unlist(strsplit(x, "[ ,]")))
    によって,以下の結果を得るでしょう。
       ANA DEL JAL 
     2   3   1   3 
    strsplit の split を "[ ,]" にしているのは,「要素とカンマのみ」とはいうものの,"ANA, JAL" のようにスペースも入っていることに対応しているのではあるけれど。まえもって gsub で,空白を削除しておく方がよさそう。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-20 (金) 10:44:59
  • ご返信ありがとうございます。データ入力の仕方に改善の余地があると感じました。もしエクセルで各セルに「ANA」「DEL」など単一のデータのみが入力されていた場合、splitはどのようになりますか? -- risperidone? 2015-02-20 (金) 10:50:04
  • > もしエクセルで各セルに「ANA」「DEL」など単一のデータのみが入力されていた場合
    って,要するに 1 行に 1 つのデータということでしょう?読み込んだベクトルの各要素は ANA とか JAL になるわけだから,strsplit なんかいりません。table(x) だけでよいです。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-20 (金) 11:12:29
  • ありがとうございます。大変参考になりました。 -- risperidone? 2015-02-20 (金) 11:19:48

SPSSから読み込んだデータの数値をNAに置き換えできません

Thomas? (2015-02-20 (金) 00:28:36)

はじめまして。Windows7SP1上でR 3.1.2 64bitを使っています。SPSS21から以下のようにデータを読み込み特定値(-99)をNAに置き換えたいのですが,「 (list) オブジェクトは 'double' に変換できません」というエラーが出てしまい置き換えができません。どうしたらよいのでしょうか?
データ例(test.sav)

V1 V2
1 -99
2 22
3 23
4 24

(なおここで-99はSPSS上ではユーザ欠損値にはなっておりません)

install.packages("memisc")
library(memisc)
data <- as.data.set(spss.system.file("test.sav"))
dat[dat == -99] <- NA

以下にエラー `[<-.data.frame`(`*tmp*`, i, j, value = NA) : 
  (list) オブジェクトは 'double' に変換できません。

dat$v2[dat$v2 == -99] <- NA と変数を明示的に指定するとエラーなく通るのですが,実際には沢山の変数があるので,できればいっきにまとめて置き換えたいのです。またいったんSPSSからcsvファイルに落としてread.csvで読むと dat[dat ==- 99] <- NA でも問題なく通るのですが,なぜかSPSSから直接読むとエラーになってしまい,なぜそのようなことが発生するのか理解できなくなっております。
どうかよろしくお願い申し上げます。

  • data.setオブジェクトはdata.frameとは別のものです.read.csvで返されるのはdata.frameオブジェクトなので,data.frameの機能として,dat==-99の結果がmatrix型として返されます.data.setオブジェクトにはそういう自動変換機能がないのでしょう.したがって,data.setオブジェクトをdata.frameオブジェクトに変換すれば,dat[dat==-99]<-NAも実行可能になるでしょう.
    なお,変換はas.data.frame関数を使うことで可能ですが,data.setオブジェクトのほうが持っている情報量が多いので,data.frameへの変換時にすべての情報が保持されることはないでしょう.一度カンマ区切りファイルに落として読み込むのと同じ状態になるということです. -- 2015-02-20 (金) 01:03:46
  • ありがとうございました。data.frameとは別物で読み込まれるのですか!理解しました。 -- Thomas? 2015-02-20 (金) 07:54:24
  • Thomas さん,あなたは,「整形ルール」のページの一部を壊しましたね。困ります。直しておきましたけど。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-20 (金) 10:21:45
  • 申しわけありません。よくわからずひな形の欄を触ってしまいました。壊してしまったのですか。 -- Thomas? 2015-02-20 (金) 10:27:43
  • 自分の書き込みを削除するときに,それ以外のかなりの行を削除してしまったようですよ。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-20 (金) 10:30:19
  • 編集の窓の中をいじると実際の表示に直接反映されてしまうのですね(投稿用のテンプレートと勘違いしておりました)。これから気をつけます。申しわけありませんでした。 -- Thomas? 2015-02-20 (金) 10:37:45
  • 上記data.setを dan<-as.data.frame(dat) としてdata.frameに変換してみましたが,やはり,dan[dan==-99]でうまくできました。ありがとうございました。 -- Thomas? 2015-02-20 (金) 10:43:56

各数値の間にカンマを自動挿入してエクセルのデータをRにコピペしたい

risperidone? (2015-02-18 (水) 17:53:36)

表題通りですが、エクセルデータ(csv)の数値をエクセル上でコピーして、

x=c(3619, 7797, 5039, 1617, 8876, 2156, 1659, 504, 387, 2282, 2891, 1636, 518, 1066, 1061)

といった風に、数値の間にカンマを自動で入れるためのテクニックがあればご教授下さい。
今までは手動でカンマの挿入をやっていました。

  • Excel でコピー,R コンソールで dput(scan("")) とすると,「1:」のようなプロンプトが出るので,R コンソールにペーストすると,c(1, 2, 3,...) のように表示されるので,その部分をコピーして利用するというのはいかがですか? -- 河童の屁は,河童にあらず,屁である。? 2015-02-18 (水) 18:16:28
    > dput(scan(""))
    1: 1	2	3	4 << ペースト
    5:                         << リターンキーを押す
    Read 4 items
    c(1, 2, 3, 4)              << これをコピーして利用する
    > x <- c(1, 2, 3, 4)       << たとえば,こんなふうに
    別解
    Mac の場合,次の様な関数を作っておく。
    p <- function() {
      con <- pipe("pbpaste", "r")
      txt <- scan(con)
      close(con)
      con <- pipe("pbcopy", "w")
      cat("c(", paste(txt, collapse=", "), ")", file=con, sep="")
      close(con)
    }
    1. Excel でコピーする。
    2. R で p() を実行する
    3. 変換された文字列がバッファーにあるので,必要なところでペーストする。
    Windows の場合は
    p <- function() cat("c(", paste(scan("clipboard"), collapse=", "), ")", file="clipboard", sep="")
    かな?使い方は同じ。
  • ご回答ありがとうございます。dput(scan(""))、大変便利です。複数グループの縦列別にcsvを作成しテキストエディタで開いてカンマ付きデータを作っていましたが、dput(scan(""))の方が格段に便利です。大変参考になりました。ありがとうございます。 -- risperidone? 2015-02-18 (水) 19:05:07

単独でなく複数のデータを一括で読み込みたいのですが...

shino? (2015-02-12 (木) 19:31:14)

はじめまして。
私は今、以下のデータ(DAU,DPU,行動データ)をそれぞれ一括で読み込もうと試行錯誤しています。
sample-data/section8/daily/dau/game-01/2013-05-01~2013-10-31
sample-data/section8/daily/dpu/game-01/2013-05-01~2013-10-31
sample-data/section8/daily/action/game-01/2013-10-31

下記のコードをRで実行した際
「関数 "ldply" を見つけることができませんでした 。」とエラーが出てき、ここからどうすればよいのかわかりません。
ご教授のほどよろしくお願い申し上げます。

> library(“plyr”)
> library(“foreach”)
> readTsvDates <- function(base.dir, app.name, date.from, date.to) {
+ date.from <- as.Date(date.from)
+ date.to <- as.Date(date.to)
+ dates <- seq.Date(date.from, date.to, by = "day")
+ x <- ldply(foreach(day = dates, combine = rbind) %do% {
+ read.csv(sprintf("%s/%s/%s/data.tsv", base.dir, app.name, day),
+ header = T,
+ sep = "\t", stringsAsFactors = F)
+ })
+ x
+ }
> 
> # DAUを読みこむ関数
> readDau <- function(app.name, date.from, date.to = date.from) {
+ data <- readTsvDates("sample-data/section8/daily/dau", app.name,
+ date.from, date.to)
+ data
+ }
> # DPUを読みこむ関数
> readDpu <- function(app.name, date.from, date.to = date.from) {
+ data <- readTsvDates("sample-data/section8/daily/dpu", app.name,
+ date.from, date.to)
+ data
+ }
> # 行動データを読みこむ関数
> readActionDaily <- function(app.name, date.from, date.to = date.from) {
+ data <- readTsvDates("sample-data/section8/daily/action", app.name,
+ date.from, date.to)
+ data
+ }
> 
> # データの読みこみ
> 
> # DAU
> dau <- readDau("game-01", "2013-05-01", "2013-10-31")
 以下にエラー readTsvDates("sample-data/section8/daily/dau", app.name, date.from,  : 
   関数 "ldply" を見つけることができませんでした 
> head(dau)
    log_date app_name user_id
1 2013-08-01  game-01   33754
2 2013-08-01  game-01   28598
3 2013-08-01  game-01   30306
4 2013-08-01  game-01     117
5 2013-08-01  game-01    6605
6 2013-08-01  game-01     346
> # DPU
> dpu <- readDpu("game-01", "2013-05-01", "2013-10-31")
 以下にエラー readTsvDates("sample-data/section8/daily/dpu", app.name, date.from,  : 
   関数 "ldply" を見つけることができませんでした 
> head(dpu)
    log_date app_name user_id payment
1 2013-06-01  game-01     351    1333
2 2013-06-01  game-01   12796      81
3 2013-06-01  game-01     364     571
4 2013-06-01  game-01   13212     648
5 2013-06-01  game-01   13212    1142
6 2013-06-01  game-01   13212     571
> # Action
> user.action <- readActionDaily("game-01", "2013-10-31", "2013-10-31")
 以下にエラー readTsvDates("sample-data/section8/daily/action", app.name, date.from,  : 
   関数 "ldply" を見つけることができませんでした 
> head(user.action)
 以下にエラー head(user.action) :  オブジェクト 'user.action' がありません 
  • そもそもforeach(day = dates, .combine = rbind)とちゃんと指定してやればlist型で戻らないので、ldply要らない気がしますが。 -- 2015-02-13 (金) 20:46:52
  • .combineの手前の”どっと”をつけ忘れる→listを展開したい→ldplyということでしょうか。 -- 2015-02-13 (金) 20:52:32
  • ご返答ありがとうございます!!
    自分でも少しわかりにくいコードでしたので、簡略化してみました。おかげでエラーは発生しなくなりましたが、データは依然として8月からしか読み取れていないようです... -- shino? 2015-02-15 (日) 08:34:38
    > library(plyr)
    > library(foreach)
    foreach: simple, scalable parallel programming from Revolution Analytics
    Use Revolution R for scalability, fault tolerance and more.
    http://www.revolutionanalytics.com
    >
    > readDau <- function(app.name, date.from, date.to) {
    +  date.from <- as.Date(date.from)
    +  date.to <- as.Date(date.to)
    +  dates <- seq.Date(date.from, date.to, by = "day")
    +  ldply(foreach(day = dates, combine = rbind) %do% {
    +  base.dir <- "sample-data/section8/daily/dau"
    +  f <- sprintf("%s/%s/%s/data.tsv",
    +  base.dir, app.name, day)
    +  read.csv(f, header = T, stringsAsFactors = F)
    +  })
    +  }
    >
    > dau <- readDau(“game-01", "2013-05-01", "2013-10-31")
    > head(dau)
        log_date app_name user_id
    1 2013-08-01  game-01   33754
    2 2013-08-01  game-01   28598
    3 2013-08-01  game-01   30306
    4 2013-08-01  game-01     117
    5 2013-08-01  game-01    6605
    6 2013-08-01  game-01     346
    自動編集機能があるわけじゃないのだからね!

重回帰分析を行った後にVIFが求められない

risperidone? (2015-02-10 (火) 00:34:05)

初めてこちらに質問させて頂きます。宜しくお願いします。
R(3.1.2)をMac OS X 10.10.2で使っています。
重回帰分析までは出来たように思えます。
説明変数はregimen=投薬数、maleは性別、治療アウトカムは治癒したか否かです。
データは全て疾患A・B・Cのいずれかに該当します。

> result1 = lm(regimen ~ male + 疾患A-1 + 疾患B + 疾患C + 初発年齢 + 
               投与開始年齢 + 最終受診時年齢 + 治療アウトカム, data=dat)
> summary(result1)
Call:
lm(regimen ~ male + 疾患A-1 + 疾患B + 疾患C + 初発年齢 +
   投与開始年齢 + 最終受診時年齢 + 治療アウトカム, data=dat)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.0473 -1.3977 -0.3918  0.8142 11.5159 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
male            0.19436    0.22706   0.856 0.392499    
疾患A           0.95790    0.48769   1.964 0.050192 .  
疾患B           2.58759    0.43024   6.014 4.03e-09 ***
疾患C           1.93298    0.37667   5.132 4.45e-07 ***
初発年齢        0.04138    0.02220   1.864 0.063002 .  
治療開始年齢   -0.08136    0.02203  -3.692 0.000252 ***
最終受診年齢    0.03569    0.01069   3.340 0.000916 ***
治療アウトカム  1.49465    0.22467   6.653 9.31e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.239 on 407 degrees of freedom
Multiple R-squared:  0.7106,	Adjusted R-squared:  0.7049 
F-statistic: 124.9 on 8 and 407 DF,  p-value: < 2.2e-16

ここでVIFパッケージをインストールしました。

 URL 'http://cran.ism.ac.jp/bin/macosx/mavericks/contrib/3.1/VIF_1.0.tgz' を試しています 
Content type 'application/x-gzip' length 2356946 bytes (2.2 Mb)
 開かれた URL 
==================================================
downloaded 2.2 Mb

 ダウンロードされたパッケージは、以下にあります 
 	/var/folders/4k/37q819dx1dn03k0zl3n0yhth0000gp/T//Rtmp9lSQKf/downloaded_packages 
> library(VIF)
> vif(result1)
 以下にエラー as.vector(y) - mean(y) :  二項演算子の引数が数値ではありません 
 追加情報:  警告メッセージ: 
In mean.default(y) : argument is not numeric or logical: returning NA

エラーメッセージ後の対応が分からず苦慮しております。ご教授頂けたら幸いです。宜しくお願いします。
ファイル添付からデータをアップロードさせて頂きました。

  • data1.csv ですか?変数名が regimen,male,JME,TLE,nJnT,first,AEDage,lastAge,outcome となっているので,このまま lm できません。分からない人だなあ。
    vif のオンラインヘルプ読みました?vif selects variables for a linear model. It returns a subset of variables for building a linear model. ですよ。vif を計算するものではないし,使い方も違う(第 1 パラメータは lm オブジェクトなんかではない)。
    使うべきは,DAAG ライブラリの vif じゃないの?? -- 河童の屁は,河童にあらず,屁である。? 2015-02-10 (火) 08:51:59
  • DAAGライブラリのvifを用いたいのですが、以下のようなエラーメッセージが出る場合はどうしたら良いでしょうか? -- risperidone? 2015-02-10 (火) 09:42:54
    URL 'http://cran.ism.ac.jp/bin/macosx/mavericks/contrib/3.1/DAAG_1.20.tgz' を試しています
     Content type 'application/x-gzip' length 1983807 bytes (1.9 Mb)  開かれた URL  
    ==================================================
    downloaded 1.9 Mb    ダウンロードされたパッケージは、以下にあります
      	/var/folders/4k/37q819dx1dn03k0zl3n0yhth0000gp/T//RtmpBg33vj/downloaded_packages
    > library(DAAG)  要求されたパッケージ lattice をロード中です
    Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) :
        ‘latticeExtra’ という名前のパッケージはありません
     エラー:  ‘DAAG’ に対するパッケージもしくは名前空間のロードが失敗しました
  • > ‘latticeExtra’ という名前のパッケージはありません
    といわれているでしょう。DAGG パッケージをインストールするときに,依存パッケージもインストールするように指定しておかないとこんなことになります。
    パッケージインストーラのウインドウで,「依存パッケージも含める」にチェックを付けておくようにしましょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-10 (火) 11:14:45
  • 無事、VIFが出ました。ありがとうございました。
    もう1つ質問させてください。data_ANCOVA.csvを今からuploadします。こちらで「JME,TLE,nJnT」をseizure_typeとして「1,2,3」と割り振りしました。変数名は「regimen,sex,seuzire_type,first,AEDage,lastAge,outcom」となります。こちらで分散分析を行ってseizure_typeによってregimen数が異なる事を示したいと思ったのですが、
    > result3 <- lm(regimen ~ sex + seizure_type + first + AEDage + lastAge + outcome, data=dat3)
    > summary(result3)
    
    Call:
    lm(formula = regimen ~ sex + seizure_type + first + AEDage + 
        lastAge + outcome, data = dat3)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -3.8267 -1.5011 -0.3003  0.8695 11.3550 
    
    Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
    (Intercept)   1.738749   0.572593   3.037 0.002546
    sex           0.191705   0.230669   0.831 0.406413
    seizure_type  0.003416   0.181867   0.019 0.985023
    first         0.033675   0.022452   1.500 0.134426
    AEDage       -0.075155   0.022321  -3.367 0.000832
    lastAge       0.043301   0.010658   4.063 5.82e-05
    outcome       1.609017   0.226135   7.115 5.05e-12
    
    Residual standard error: 2.275 on 408 degrees of freedom
    Multiple R-squared:  0.1676,	Adjusted R-squared:  0.1553 
    F-statistic: 13.69 on 6 and 408 DF,  p-value: 3.515e-14
    > install.packages("car") 省略
    > library(car)
    > Anova(result3)
    Anova Table (Type II tests)
    
    Response: regimen
                  Sum Sq  Df F value    Pr(>F)
    sex             3.58   1  0.6907 0.4064126
    seizure_type    0.00   1  0.0004 0.9850233
    first          11.64   1  2.2496 0.1344258
    AEDage         58.68   1 11.3364 0.0008321
    lastAge        85.44   1 16.5058 5.818e-05
    outcome       262.05   1 50.6274 5.053e-12
    Residuals    2111.86 408                  
    となりました。seizure_typeのPrが0.9850233となりました。しかし、SPSSでやった一変量の分散分析とは異なる結果(SPSSではseizure_typeのP<0.001)になってしまいました。Rでの処理の仕方が悪かったでしょうか。使用したcsvは同一のものです。 -- risperidone? 2015-02-10 (火) 17:03:55
  • 記事の投稿方法について,ちゃんと理解してから利用してください。いちいちこちらが修正していたけど,もういやだ。といいながら,編集したけど(アスタリスクは表示しないモードで)
    質問の件は,type II とか type III の違いでしょう。私はやる気がないので,これにて失礼。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-10 (火) 17:36:52
  • 修正のお手間をかけ申し訳ありませんでした。Rを使ってtype II・type IIIの両方で分散分析をしましたがseizure_typeのPrが0.9850233とほぼ同一で、SPSSでの一変量の分散分析結果(p<0.001)と大きく異なってしまいました。データの入力方法・コマンドで誤りがあればご教授下さい。お願いします。 -- risperidone? 2015-02-10 (火) 21:48:27
  • まだ誰からもコメントがないようなので,本筋ではないがコメント。
    > 「JME,TLE,nJnT」をseizure_typeとして「1,2,3」と割り振り
    おかしいでしょうそれは。少なくとも 1,2,3 を factor にしないと,分析的には不適切。
    > SPSSでやった一変量の分散分析とは異なる
    よく読んでいなかったのだけど,R での ancova と spss の一変量分散分析(一元配置分散分析)の結果が一致しないのは当たり前(少なくとも同じ P 値になる確率は 0)。
    seizure_type を Factor にする(一元配置分散分析のときは,Factor でなくても同じ結果になる)
    > dat3$seizure_type <- factor(dat3$seizure_type)
    > oneway.test(regimen~seizure_type, dat3, var.equal=TRUE)
    
    	One-way analysis of means
    
    data:  regimen and seizure_type
    F = 10.6063, num df = 2, denom df = 412, p-value = 3.224e-05
    lm の結果は違うものになる(seizure_type1 がベースラインになる)
    > result3 <- lm(regimen ~ sex + seizure_type + first + AEDage + lastAge + outcome, data=dat3)
    > summary(result3)
    
    Call:
    lm(formula = regimen ~ sex + seizure_type + first + AEDage + 
        lastAge + outcome, data = dat3)
    
    Residuals:
        Min      1Q  Median      3Q     Max 
    -4.0473 -1.3977 -0.3918  0.8142 11.5159 
    
    Coefficients:
                  Estimate Std. Error t value Pr(>|t|)
    (Intercept)    0.95790    0.48769   1.964 0.050192
    sex            0.19436    0.22706   0.856 0.392499
    seizure_type2  1.62969    0.46882   3.476 0.000563
    seizure_type3  0.97509    0.44129   2.210 0.027688
    first          0.04138    0.02220   1.864 0.063002
    AEDage        -0.08136    0.02203  -3.692 0.000252
    lastAge        0.03569    0.01069   3.340 0.000916
    outcome        1.49465    0.22467   6.653 9.31e-11
    
    Residual standard error: 2.239 on 407 degrees of freedom
    Multiple R-squared:  0.1954,	Adjusted R-squared:  0.1816 
    F-statistic: 14.12 on 7 and 407 DF,  p-value: < 2.2e-16
    Anova も結果が変わる
    > library(car)
    > Anova(result3)
    Anova Table (Type II tests)
    
    Response: regimen
                  Sum Sq  Df F value    Pr(>F)
    sex             3.67   1  0.7327 0.3924989
    seizure_type   70.65   2  7.0439 0.0009832
    first          17.43   1  3.4755 0.0630017
    AEDage         68.37   1 13.6334 0.0002525
    lastAge        55.94   1 11.1536 0.0009160
    outcome       221.96   1 44.2578 9.308e-11
    Residuals    2041.21 407                  
    重回帰分析にカテゴリー変数を使うときには注意が必要(初歩的ではあるが) -- 河童の屁は,河童にあらず,屁である。? 2015-02-11 (水) 09:29:02
  • ご回答、本当にありがとうございました。初歩的な質問に丁寧に答えて頂き感謝致します。Factorにする事、しっかり勉強させて頂きました。 -- risperidone? 2015-02-11 (水) 22:28:42

beeswarmを使った散布図のプロット

Bee? (2015-02-09 (月) 20:24:44)

初めまして。beeswarmを使用して散布図を作成しています。PC上ではカラーで綺麗なのですが、論文投稿のため2群間のプロットを○と●で表示したいのですが、どの様にしてよいのか分かりません。

data1 <- read.delim("clipboard")
beeswarm(temp~ day, data = data1,
pch = 16, pwcol = 1 + as.numeric(kubun),
xlab = "", ylab = "Follow-up time (months)",
labels = c("day1", "day3", "day5", "day8", "day10", "day12",
"day15","day18", "day21"))
legend("topright", legend = c("F", "G"),
title = "Censored", pch = 16, col = 1:2)

の、pwcol = 1 + as.numeric(kubun) が、解決するポイントとは思いますが、どの様にすれば良いのか解らず困っております。

何とぞ、お教えの程お願いいたします。

R ×64 3.1.2 を使用しています。 

  • pch=c(1,16)[as.numeric(kubun)] とかにすれば,よいでしょう。
    data1 <- read.delim("clipboard") では,どんなデータかわからないでしょう。適切な回答を求めるならば,データも添付するなりしてあなたがやったとおりのことを回答者も出来るようにして置いた方がよいですね。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-09 (月) 21:40:37
  • 申し訳ありませんでした。データは以下のとおりです。kubun 毎に色分けしたいと考えています。何とぞ御教示お願いいたします。 -- Bee? 2015-02-10 (火) 08:56:47
    kubun	day	temp
    2	1	35.9
    1	1	36.5
    1	1	36.5
    2	1	36.8
    1	1	36.9
    2	1	36.9
    2	1	37.2
    1	1	37.3
    2	1	37.3
    1	1	38.8
    1	3	36.3
    1	3	36.3
    2	3	36.3
    1	3	36.5
    1	3	36.7
    2	3	36.7
    2	3	36.8
    1	3	36.9
    2	3	37.8
  • 以下のようにすればよいでしょう。
    beeswarm 中の pch, col と pwpch, pwcol の違い,legend 中では pch, pcol を使う(データフレーム中の列名の指定の違い)などに注意。
    テスト用のデータも,あんなにたくさんは必要ないので,最小限に削っておきます。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-10 (火) 11:53:17
    library(beeswarm)
    beeswarm(temp ~ day, data = data1,
      pwpch = c(1, 16)[as.numeric(kubun)], pwcol = as.numeric(kubun),
      xlab = "", ylab = "Follow-up time (months)",
      labels = paste("day", c(1, 3, 5, 8, 10, 12, 15, 18, 21), sep=""))
    legend("top", legend = c("F", "G"),
      title = "Censored", pch = c(1,16)[as.numeric(data1$kubun)], col = (1:2)
      [as.numeric(data1$kubun)])
  • ありがとうございました。解決いたしました。 pwcol の使い方を勉強してみます。  -- 2015-02-10 (火) 19:26:54

あらためて、多重クロス集計について

島田泰夫? (2015-02-07 (土) 08:29:45)

ふたたび質問させて下さい。

やはり解決しないので・・・

wd <- sample(1:16,100, replace=TRUE)
ws <- sample(0:10,100, replace=TRUE)
inds <- sample(0:100,100, replace=TRUE)
d <- data.frame(wd=wd, ws=ws, inds=inds)

ここから、wdとwsのクロス集計表を作成し、そこからこのクロス集計に対応したindsの合計値(表)を得たいのです。

tapply(d$inds, d$wd, d$ws, sum)

は、文法上できないですし
そこで・・

re <- ftable(d$inds, d$wd, d$ws)

から得られたオブジェクトを操作しようとして

gyo <- sort(unique(d$inds))
gyo2 <- length(gyo)
gyo3 <-  0
re.mat <- matrix(nr=16, nc=11,0)
for ( i in 1: gyo2){
 for ( j in 1:16 ){
   gyo3 <- gyo3 +1
  for ( k in 1:11){
   re.mat[j, k] <- re.mat[j, k] + re[gyo3,k]*gyo[i]
}}}

としてようやく目的の値(表)を得ることができましたが、汚いです。
もう少し効率的、綺麗な方法はありませんでしょうか?

  • tapply を使おうと思ったのは筋がよいですね。ただ,オンラインヘルプを良く読めば,tapply(d$inds, list(d$wd, d$ws), sum) のようにしないといけないだろうということ。そして,少しアフターケアーが必要。
    a <- tapply(d$inds, list(d$wd, d$ws), sum)
    a[is.na(a)] <- 0
    a
    しかし,もっと良い方法がある。
    xtabs(inds ~ wd + ws, d)
    関数 1 つで,答えが求まる。-- 河童の屁は,河童にあらず,屁である。? 2015-02-07 (土) 09:22:55
  • ありがとうございました。listの使い方、xtabs等、大変参考になりました。勉強します。 -- 島田泰夫? 2015-02-07 (土) 11:55:01

balloonplotの行名を並び替えたい

島田 泰夫? (2015-02-05 (木) 10:58:21)

初歩的な質問で恐縮です。
library(gplots)のballoonplotについて、教えて下さい。

wd1 <- sample(c(1:16),100, replace=TRUE)
wd2 <- sample(c(1:16),100, replace=TRUE)
inds  <- sample(c(0:25),100,replace=TRUE)

ここから

balloonplot(wd1,wd2,inds)

とすると、列名は1〜16にきちんと並びますが、行名がバラバラになります。
行名を1〜16に並べる方法はありますでしょうか・・・?

  • そのようなデータ構造だとballoonplotの仕組みから、決して行名はそろわないと思いますよ。でも、例えば、次のようなデータ構造ならそろいます。従って、データ構造の変更が必要になると思います。 -- 2015-02-05 (木) 11:40:23
    > d <- cbind(expand.grid(wd1 = 1:16, wd2 = 1:16), inds = sample(c(0:25, NA), 256, replace=TRUE))
    > with(d, balloonplot(wd1, wd2, inds))
  • なるほど、そういうことだったんですね。ありがとうございました。 -- 島田泰夫? 2015-02-05 (木) 12:55:09

文字列の置換について

Fk? (2015-02-04 (水) 09:44:05)

お世話になります。 win 7, R 3.0.2を使用しています。

a <- c("1_2_3_4_5", "2_3_4_1_5")
dat <- data.frame(C1=c(3,2,4,1,5), C2=c(4,5,3,2,1))


ここで、aの数字をdatのC1列からC2列への行方向に置換して、a[1]は"2_5_4_3_1"、a[2]は"5_4_3_2_1"になるようにしたいです。実際にはaはもっとたくさんの要素をもち、datも数十行はあります。

strsplitでaを分割してgsubするという処理をfor文で繰り返そうかと思ったのですが、繰り返しの過程で置換したものを再置換してしまいそうでわからなくなりました。

宜しくお願いします。

  • 一行プログラムコンテストなら
    unlist(lapply(lapply(lapply(strsplit(a,"_"),as.numeric),function(x)unlist(lapply(lapply(x,`==`,dat[,"C1"]),function(x){dat[x,"C2"]}))),paste,sep="",collapse="_"))
    こんな感じです -- なかま 2015-02-04 (水) 12:42:08
  • ありがとうございます。ちょっと何がどうなっているかわからないので解読してみます。 -- Fk? 2015-02-04 (水) 13:10:16
  • 一行だと解読が難しくなるけど,以下のようなプログラムだと何をやっているか明瞭。
    a <- c("1_2_3_4_5", "2_3_4_1_5")
    dat <- data.frame(C1=c(3,2,4,1,5), C2=c(4,5,3,2,1))
    c1 <- as.character(dat$C1) # 拡張可能性を残すように文字型で扱う(data.frame にする必要はない)
    c2 <- as.character(dat$C2) # 同じく
    for (i in seq_along(a)) { # a の各要素について
      s <- unlist(strsplit(a[i], "_")) # "_" を区切り文字として文字ベクトル s を作る
      for (j in seq_along(c1)) { # s の各文字 s[j] について
        s[j] <- c2[which(s[j] == c1)] # s[j] と等しい c1 の要素と同じ位置にある c2 の要素を s[j] に代入
      }
      a[i] <- paste(s, collapse="_") # 文字ベクトル s の要素を "_" で繋いで 1 つの文字列にする
    }
    a
    内側の for は sapply で置き換えると
    for (i in seq_along(a)) {
      s <- unlist(strsplit(a[i], "_"))
      s <- sapply(s, function(ch) c2[which(ch == c1)])
      a[i] <- paste(s, collapse="_")
    }
    のようになり,さらに,s を次々に関数に渡してやると,
    for (i in seq_along(a)) {
      a[i] <- paste(sapply(unlist(strsplit(a[i], "_")), function(ch) c2[which(ch == c1)]), collapse="_")
    }
    のように 1 行になる。外の for も sapply にできるけど,そこまでやるとやり過ぎ感が...C1, C2 も元のままを使うと以下のような一行野郎ができあがる(なかまさんのより若干短い)
    unname(sapply(a,function(b)paste(sapply(unlist(strsplit(b,"_")),function(ch)as.character(dat$C2)[which(ch==as.character(dat$C1))]),collapse="_")))
    a の中の数が 1 桁だけならば,which の代わりに chartr を使うようにすればもう少し簡単になるが... -- 河童の屁は,河童にあらず,屁である。? 2015-02-04 (水) 14:51:18

時系列軸を反転させたい

けい? (2015-02-03 (火) 16:31:35)

はじめまして。
時系列を使った相関図を書きたいのですが、上下反転がうまく行きません。
X軸に個数、Y軸に時間という設定で、時間は上から下に進んでいくという流れで設定したいのですけど、

attach(df)
x <- strptime(TIME, "%H:%M:%S", tz = "")
plot(Count, x, pch = 16, col = "#FF5050", cex =1, xlab = "", ylab = "", yaxt = "n")
r <- as.POSIXct(round(range(x), "mins"))
axis.POSIXct(2, at = seq(r[1], r[2], by = "mins"), format = "%H:%M")
detach(df1)

では、当然r[1]が下に来てしまうので、逆になってしまいます。
seq内のr[1]とr[2]をしたり、byをマイナスにしたり・・(当然エラーになりますが)なかなかうまく行きません。
プロット自体はplotにylim=c(r[2], r[1])を入れれば反転しますが、軸が表示されなくなってしまいました。

いい方法があれば、どうかよろしくお願いいたします。

  • 以下の様にしてみるとか。 -- 河童の屁は,河童にあらず,屁である。? 2015-02-03 (火) 18:12:08
    set.seed(12345)
    n <- 20
    x <- Sys.time()+1:n*60
    Count <- sample(100, n)
    plot(Count, x, pch = 16, col = "#FF5050", cex =1, xlab = "", ylab = "", yaxt = "",
    ylim=c(x[n], x[1]))
    axis(2, at = as.numeric(x), labels=substring(as.character(x), 12, 16))
  • 上手く上下逆の時系列軸を作れました。あとは自分で改良してやってみます。ありがとうございました。 -- けい? 2015-02-04 (水) 09:56:18

「≤」をtextとして図に描きたい

高田? (2015-02-02 (月) 19:43:14)

はじめまして。
数学記号の「≤」をtextとして図に描きこめないものかと苦労しております。
今のところ試してみたのは、expression関数や、mtextでfontを指定してみる方法ですが、うまくいきません。
どなたかいい方法をご存じの方おられないでしょうか。
どうかよろしくお願い申し上げます。

  • どこに描き込みたいのでしょうか?それによるでしょうから,取り合えずのプログラムを掲載してみれば?≤ を @ ででも置き換えて。
    以下の例も参考になるかな? -- 河童の屁は,河童にあらず,屁である。? 2015-02-02 (月) 21:59:30
    plot(0, 0, xlim=c(0,1), ylim=c(0,1), type="n", xlab="u ≦ v", ylab=expression(aa <= bb))
    text(0.2, 0.2, expression(x <= y))
    text(0.2, 0.5, "x ≦ y")
    mtext("x ≦ y", 3, 0.5)
    mtext(expression(x <= y), 1, 3)
    legend("topright", legend=c(expression(x1 <= y2), "w≦q"))
    sample2.png
  • レスポンスありがとうございます。
    説明が不足しておりました。
    確かにご指摘のように「x≤90」などの書き込みは可能なのですが、「≤90」などと文字を削ると途端に無理になってしまいます。
    例えば、
    mtext(expression(90<=), 1, 3)
    などとすると、Unicodeで「90<U+2264>」と表示されてしまいます。
    また、
    mtext(expression(paste("90<=", "", sep="")), 1, 3)
    としても同様の結果です。
    どうにか「≤」だけ吐き出す方法はないものでしょうか。 -- 高田? 2015-02-03 (火) 11:55:46
  • expression("" <= y) とするとどうでしょうか。 -- wakakumo? 2015-02-03 (火) 12:33:43
  • 例に示したように"≦" を使えばよいのでは?mtext("90≦", 1, 1) -- 河童の屁は,河童にあらず,屁である。? 2015-02-03 (火) 12:40:05
  • 前提や縛りなどの説明がないために回答側が迷走しているように見えます。UnicodeはNGという縛りで回答を求めているのでしょうか。どのグラフィックディバイスの話をしているのでしょうか。X11()など画面表示でしょうか、それともPDFやPostScript?でしょうか。ちなみに、こちらの環境ではmtext(expression(90<=''), 1, 3)またはmtext(expression(90<=""), 1, 3)によってX11()及びpdf()で「90≤」と表示されます。もちろん、mtext(expression(""<=90), 1, 3)も問題ありません。 -- 2015-02-03 (火) 13:08:02

MySQLからデータフレームに取り込み後のラベルの変更について

マンジャ? (2015-01-28 (水) 21:30:08)

はじめまして、RでパッケージRMySQLを使いテーブルのデータをRのデータフレームとして取り込みました。

※コネクション確立後にSQLを発行してデータフレームに取り込んだ所、

data.table <- dbGetQuery(dbconnector, "select * from 〜 ")

※データ(MySQLテーブル:販売履歴)
商品名 販売日時 販売単価 販売個数
りんご ○○○○ ☓☓☓☓ △△△△
みかん ○○○○ ☓☓☓☓ △△△△
なし  ○○○○ ☓☓☓☓ △△△△

※データフレーム
  商品名 販売日時 販売単価 販売個数
1 りんご ○○○○ ☓☓☓☓ △△△△
2 みかん ○○○○ ☓☓☓☓ △△△△
3 なし  ○○○○ ☓☓☓☓ △△△△

データフレーム上では1,2,3が自動採番されてしまいます。
この時商品名をラベルとして変更するにはどのようにすれば良いのでしょうか?

レコード数は数万件あり一括でラベルとして変更したく思います。

宜しくご示唆お願いします。

  • その番号は行ラベルなので,データの分析には直接関係ありません。そのままにしておいても,何の不都合もありません。
    どうしても,商品名列にある文字列を行ラベルにしたいということならば,rownames(data.table) <- data.table$商品名 とすればよいですが,もし商品名がユニークでない場合は警告が出ますよ。
    data.frame のオンラインヘルプを見てください,以下の様に書かれていますよ。
    A data frame is a list of variables of the same number of rows with unique row names, given class "data.frame". If no variables are included, the row names determine the number of rows. -- 河童の屁は,河童にあらず,屁である。? 2015-01-29 (木) 09:43:29
  • 河童さま ありがとうございました。上手く行きました。 当該のテーブルは品目毎の売上テーブルでありクラスター分析を用いて似たような商品を調べようとした所、品名(品目コード)が分析の対象になると都合が悪いと思い質問させて頂いた次第です。今回はお助け頂きありがあとうございました。。 -- マンジャ? 2015-01-29 (木) 13:18:31

Loessにおける平滑化幅について

SAN? (2015-01-25 (日) 13:50:03)

はじめまして,Loessにおける平滑化幅についてなのですが,Loessにおける平滑化パラメータはspanの引数で決められているみたいなのですが,疑問点があります.

例えば,100個のデータがあった場合,平滑幅を10にしてLoessをかけるといった場合spanパラメータをどのように設定するべきなのでしょうか?
どなたかご教授お願いします.

  • ほかの人に聞くのもいいけど,回答を待つ間に,色々設定してみて,結果を比較してみて,その結果を基に他人の意見を聞くという態度が好ましいのでは?
    分析に使用したデータとプログラムも合わせて参照できるようにしておくと,モアベターでしょう(by 小森のおばちゃま) -- 河童の屁は,河童にあらず,屁である。? 2015-01-25 (日) 19:58:47
  • 返信ありがとうございます.色々設定してやっているのですが,違う手法と比較した際に同じ平滑幅ではないと比較できないとおもうのでそのつもりで質問していたのですが...すみません -- SAN? 2015-01-25 (日) 22:37:30

ターム・文書行列の行数について

初心者? (2015-01-23 (金) 00:04:22)

欧米語のテキストマイニングを行うパッケージのひとつにtmパッケージというのがありますが、これを使って、複数の文書ファイルのターム・文書行列を作成しますと、常に行数が36行になってしまいます。

また、潜在的意味インデキシング用のパッケージ(lsa)を利用し、特異値分解しましても、同じように36行のターム・文書行列が得られます。

英文のパッケージガイドを見ましてもなにも記載されていないのですが、何か制約があるのでしょうか?また、36行に限らず、すべてのデータを分析対象にする場合、どのようにすれば良いでしょうか?

ご教示いただけますと助かります。


xlsxについて

KK? (2015-01-22 (木) 08:16:18)

お世話になります。

エクセルを読み込もうとしてxlsxをインストールしたのですが、読み込もうとすると以下のようなエラーが出ます。

>  library(xlsx)
要求されたパッケージ rJava をロード中です 
Error :  .onLoad は loadNamespace()('rJava' に対する)の中で失敗しました、詳細は: 
 call: fun(libname, pkgname) 
 error: JAVA_HOME cannot be determined from the Registry 
エラー:  パッケージ ‘rJava’ をロードできませんでした 

別途rJavaをインストールしても同じエラーが出ました。
環境はWIn 7 64-bit, R 3.1.2 64-bit, xlsx_0.5.7です。

どなたか宜しくお願いします。

  • https://teratail.com/questions/2816 -- 2015-01-23 (金) 19:11:27
  • 遅くなりましたが、自己解決しました。デフォルトでは64bitのwindowsでも32bit版の Javaがインストールされてしまうため、別途64bit版のJavaをインストールしなければならない そうです。 http://d.hatena.ne.jp/dichika/20141112/p1 -- KK? 2015-03-16 (月) 09:43:37

あるグループを除去後グループごとに単回帰を行う方法について

佐藤? (2015-01-21 (水) 08:55:58)

はじめまして。
Windows 7でR version 3.1.0 を使用しています。
添付のようなデータでid=cを(サンプル数が少ないため)除去したうえで単回帰をして、idごとに回帰係数を取り出したいのですが、エラーメッセージがでてしまいます。除去したはずのid=cがobservation数が0で残っているのが原因ではないかと考えています
エラーを出さずに、idごとに解析を行うためにはどのようにすればいいのでしょうか?例ではグループは2つなので個別にしてもいいのですが、実際に使いたいデータではグループ数が非常に多いので個別に分けずに解析したいと考えています。

用いたデータ

id	y	x
a	1	1
a	3	2
a	3	3
a	3	4
a	3	5
a	3	6
a	3	7
a	3	8
a	3	9
a	3	10
b	1	1
b	1	2
b	2	3
b	3	4
b	4	5
b	5	6
b	4	7
b	5	8
b	6	9
b	4	10
b	1	11
b	2	12
b	3	13
b	4	14
b	5	15
b	6	16
c	3	1
c	3	2
c	3	3
c	3	4

プログラム

d <- read.csv("dummy.csv", 
  colClasses=c("factor", "numeric", "numeric"), 
  col.names=c("id", "y", "x")) #データ読み込み
d2 <- do.call("rbind", by (d, d$id, function(x)
  subset(x, length(id)>=10))) # サンプル数が10以上のidのみ抽出
d3 <- lapply(split(d2, d2$id), function(x) {
  coef(lm(y~x, data=x))}) # わなごとに線形回帰
d4 <- do.call(rbind, d3) # リストをたてに並べる
d5 <- unique(d2$id) # 5日分揃っているわなid名を並べる
d6 <- cbind(d4, d5) # わなごとに線形回帰の傾きを並べる

エラーメッセージ

> d3<- lapply(split(d2, d2$id), function(x) {
+ coef(lm(y~x, data=x))}) # わなごとに線形回帰
 以下にエラー lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases
> dd <- split(d2,d2$id)
> dd
$a
     id y  x
a.1   a 1  1
a.2   a 3  2
a.3   a 3  3
a.4   a 3  4
a.5   a 3  5
a.6   a 3  6
a.7   a 3  7
a.8   a 3  8
a.9   a 3  9
a.10  a 3 10

$b
     id y  x
b.11  b 1  1
b.12  b 1  2
b.13  b 2  3
b.14  b 3  4
b.15  b 4  5
b.16  b 5  6
b.17  b 4  7
b.18  b 5  8
b.19  b 6  9
b.20  b 4 10
b.21  b 1 11
b.22  b 2 12
b.23  b 3 13
b.24  b 4 14
b.25  b 5 15
b.26  b 6 16

$c
[1] id y  x 
 <0 行> (または長さ 0 の row.names
  • d2$id と入力してみれば分かりますが,削除した c が level としては残っています。
    d2 を作った後に,d2$id <- factor(d2$id) とすればよいでしょう。-- 河童の屁は,河童にあらず,屁である。? 2015-01-21 (水) 11:25:17
  • ご教示いただきありがとうございました。解決しました。大変助かりました。 -- 佐藤? 2015-01-21 (水) 14:00:29

対応分析(数量化III類)実行時のエラーについて

田中? (2015-01-11 (日) 11:29:25)

 初めまして。エラーがでてしまいました。

 A B C D E F G H I
? 3 3 2 2 1 3 3 3 3
? 3 2 2 2 1 2 2 2 3
? 3 3 2 2 1 2 2 2 3
? 3 3 2 2 1 3 3 3 2
? 3 1 2 2 1 3 1 2 2
? 3 1 2 3 2 3 2 2 3

?以降同様のデータに

> A <- factor(gakuryoku$A, level=c(1:3), labels="A")
> B <- factor(gakuryoku$B, level=c(1:3), labels="B")
> C <- factor(gakuryoku$C, level=c(1:3), labels="C")
> D <- factor(gakuryoku$D, level=c(1:3), labels="D")
> E <- factor(gakuryoku$E, level=c(1:3), labels="E")
> F <- factor(gakuryoku$F, level=c(1:3), labels="F")
> G <- factor(gakuryoku$G, level=c(1:3), labels="G")
> H <- factor(gakuryoku$H, level=c(1:3), labels="H")
> I <- factor(gakuryoku$I, level=c(1:3), labels="I")
gakuryoku <- data.frame(A, B, C, D, E, F, G, H, I)
> summary(gakuryoku)
  A       B       C       D       E      F       G       H       I    
 A1: 0   B1:15   C1: 1   D1: 0   E1:9   F1: 1   G1: 2   H1: 1   I1:4  
 A2: 6   B2: 2   C2:19   D2:13   E2:9   F2:12   G2: 5   H2:12   I2:9  
 A3:14   B3: 3   C3: 0   D3: 7   E3:2   F3: 7   G3:13   H3: 7   I3:7  
> library(MASS)
> result <- mca(gakuryoku)
 以下にエラー svd(X) : infinite or missing values in 'x'

このようになってしまい01データに手書きでなおしたところ

> library(MASS)
> result <- corresp(gakuryoku, nf=2)
 以下にエラー if (any(x < 0 | x%%1 > 10 * sqrt(.Machine$double.eps))) warning("negative or non-integer entries in table") : 
   TRUE/FALSE が必要なところが欠損値です 

このようになってしまいました。
 ご存知のかたがいらっしゃいましたら教えていただければ幸いです。よろしくお願い致します。

  • summary(gakuryoku) の結果を見れば分かるように,A1:0, C3:0, D1:0 のように,反応のないカテゴリーがあります。計算プログラムはそのようなデータを与えられたらこけてしまいます。少なくとも,A <- factor(gakuryoku$A, level=c(2:3), labels="A") のようにすべきでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2015-01-11 (日) 12:03:02
  • ありがとうございます 解くことができました!!
    すみません できれば加えて質問させていただきたいのですが,corresp でnf=15のような対応分析と多重対応分析したものは意味が異なってしまいますでしょうか たびたび申し訳ありません。結果としては異なる数字がでてのですがどちらを用いるべきか悩んでいます。 -- 田中? 2015-01-11 (日) 16:10:05
  • nf=15 って,また,極端な。
    適切に分析すれば,以下に示すように,両者は等価な結果になりますよ。 -- 河童の屁は,河童にあらず,屁である。? 2015-01-11 (日) 21:08:20
    MASS パッケージの mca は,第1引数にデータフレーム(各列は factor),第2引数に求める次元数を指定する。
    > d <- data.frame(
    + 	V1=c("G1", "G1", "G4", "G2", "G1", "G2", "G4", "G2", "G1", "G2",
    + 	     "G3", "G1", "G4", "G3", "G2", "G2", "G4", "G3", "G1", "G1"),
    + 	V2=c("G4", "G1", "G4", "G3", "G4", "G1", "G2", "G4", "G4", "G2",
    + 	     "G2", "G3", "G1", "G4", "G3", "G2", "G3", "G4", "G4", "G4"),
    + 	V3=c("G3", "G4", "G2", "G2", "G1", "G4", "G4", "G1", "G2", "G2",
    + 	     "G2", "G2", "G4", "G2", "G2", "G1", "G2", "G2", "G2", "G1"),
    + 	V4=c("G1", "G4", "G4", "G2", "G1", "G1", "G1", "G1", "G4", "G4",
    + 	     "G3", "G1", "G2", "G3", "G1", "G1", "G3", "G2", "G2", "G4"))
    > head(d)
      V1 V2 V3 V4
    1 G1 G4 G3 G1
    2 G1 G1 G4 G4
    3 G4 G4 G2 G4
    4 G2 G3 G2 G2
    5 G1 G4 G1 G1
    6 G2 G1 G4 G1
     : 以下略
    mca による結果
    > library(MASS)
    > mca.ans <- mca(d, nf=4)
    > mca.ans$rs
                  1             2           3            4
    1  -0.026164906  0.0727723629  0.02915530  0.017382771
    2  -0.064324198 -0.0332701769  0.05114780 -0.015152209
    3   0.008399898 -0.0046851523  0.03377283 -0.007587154
    4   0.021779690 -0.0192237849 -0.02840124  0.070306712
    5  -0.024902139  0.0594956357 -0.00176808 -0.010356828
    6  -0.067724238 -0.0463843306 -0.01937229 -0.002168915
    7  -0.033804964 -0.0478207290 -0.02440187 -0.036684297
    8  -0.023898191  0.0437365528 -0.04181725 -0.010419718
    9   0.003553358  0.0327554722  0.04300472 -0.001282724
    10  0.004376380 -0.0044299836 -0.03101589 -0.028594653
    11  0.081159763 -0.0262334048 -0.01360086 -0.058987930
    12  0.005643769  0.0152553961 -0.01674848  0.050368614
    13 -0.048749672 -0.0867859703  0.03984140  0.011590533
    14  0.081340688 -0.0048070319  0.02037058 -0.031738891
    15  0.006647717 -0.0005036868 -0.05679765  0.050305724
    16 -0.024079116  0.0223101799 -0.07578869 -0.037668756
    17  0.053220714 -0.0412113236 -0.01142654  0.026460106
    18  0.053742257 -0.0045010348  0.03421316  0.005866176
    19  0.014281342  0.0166803033  0.04093021  0.031764449
    20 -0.020498151  0.0568507065  0.02870284 -0.023403011
    > mca.ans$cs
                     1            2            3            4
    V1.G1 -0.028758519  0.061572202  0.059474742  0.020657976
    V1.G2 -0.024742727 -0.001464130 -0.100721937  0.020406415
    V1.G3  0.129085140 -0.023153151  0.032606545 -0.082935116
    V1.G4 -0.009372356 -0.088190296  0.022547198 -0.004559743
    V2.G1 -0.107926641 -0.108426052  0.056979406 -0.005600561
    V2.G2  0.012380084 -0.027445479 -0.086408024 -0.118695929
    V2.G3  0.039081385 -0.022320009 -0.067651392  0.144720841
    V2.G4  0.013103783  0.058260012  0.049477716 -0.009699774
    V3.G1 -0.041806012  0.089113664 -0.054104436 -0.059993352
    V3.G2  0.054400021 -0.007267273  0.003103075  0.028487799
    V3.G3 -0.046857079  0.142220572  0.069589089  0.050965044
    V3.G4 -0.096079775 -0.104683805  0.028173707 -0.031089356
    V4.G1 -0.042147810  0.029036665 -0.061920342  0.007607840
    V4.G2  0.018380083 -0.045843728  0.051665291  0.087611794
    V4.G3  0.128773807 -0.047067716 -0.003705030 -0.062808472
    V4.G4 -0.024531855  0.018456948  0.059963333 -0.044576896
    MASS パッケージの corresp は,データフレームまたは行列を引数とする。それぞれの列(変数)は factor であってはならない。
    上で使った d を,以下のような 0/1 データ行列 m に変換する。
    > head(m)
         V1.G1 V1.G2 V1.G3 V1.G4 V2.G1 V2.G2 V2.G3 V2.G4 V3.G1 V3.G2 V3.G3 V3.G4 V4.G1 V4.G2 V4.G3 V4.G4
    [1,]     1     0     0     0     0     0     0     1     0     0     1     0     1     0     0     0
    [2,]     1     0     0     0     1     0     0     0     0     0     0     1     0     0     0     1
    [3,]     0     0     0     1     0     0     0     1     0     1     0     0     0     0     0     1
    [4,]     0     1     0     0     0     0     1     0     0     1     0     0     0     1     0     0
    [5,]     1     0     0     0     0     0     0     1     1     0     0     0     1     0     0     0
    [6,]     0     1     0     0     1     0     0     0     0     0     0     1     1     0     0     0
     : 以下略
    corresp による結果
    > corresp.ans <- corresp(m, nf=4)
    > corresp.ans$rscore
                 [,1]        [,2]        [,3]        [,4]
     [1,] -0.62635736 -1.81986611  0.80575746 -0.53244003
     [2,] -1.53984634  0.83200909  1.41355833  0.46411717
     [3,]  0.20108378  0.11716467  0.93337091  0.23239702
     [4,]  0.52138041  0.48074177 -0.78491769 -2.15351783
     [5,] -0.59612820 -1.48784631 -0.04886397  0.31723305
     [6,] -1.62123935  1.15996332 -0.53538697  0.06643460
     [7,] -0.80925145  1.19588427 -0.67438798  1.12365214
     [8,] -0.57209485 -1.09374861 -1.15569243  0.31915939
     [9,]  0.08506324 -0.81913754  1.18851013  0.03929025
    [10,]  0.10476545  0.11078350 -0.85717801  0.87586366
    [11,]  1.94287015  0.65603593 -0.37588337  1.80681978
    [12,]  0.13510526 -0.38150168 -0.46287335 -1.54280729
    [13,] -1.16701035  2.17031357  1.10108639 -0.35502187
    [14,]  1.94720128  0.12021259  0.56297632  0.97217272
    [15,]  0.15913860  0.01259603 -1.56970181 -1.54088094
    [16,] -0.57642599 -0.55792527 -2.09455211  1.15380645
    [17,]  1.27404188  1.03059855 -0.31579223 -0.81048179
    [18,]  1.28652700  0.11256032  0.94554009 -0.17968290
    [19,]  0.34187869 -0.41713526  1.13117743 -0.97295556
    [20,] -0.49070184 -1.42170283  0.79325287  0.71684197
    > corresp.ans$cscore
                [,1]        [,2]        [,3]        [,4]
    V1.G1 -0.5144480 -1.10143703  1.06391653 -0.36954110
    V1.G2 -0.4426114  0.02619115 -1.80176879 -0.36504106
    V1.G3  2.3091452  0.41417615  0.58328362  1.48358847
    V1.G4 -0.1676578  1.57759598  0.40333654  0.08156717
    V2.G1 -1.9306505  1.93958419  1.01927861  0.10018589
    V2.G2  0.2214617  0.49095966 -1.54571372  2.12329733
    V2.G3  0.6991091  0.39927246 -1.21018490 -2.58884511
    V2.G4  0.2344076 -1.04218678  0.88508429  0.17351483
    V3.G1 -0.7478487 -1.59411368 -0.96784958  1.07319370
    V3.G2  0.9731372  0.13000094  0.05550950 -0.50960523
    V3.G3 -0.8382049 -2.54411894  1.24484748 -0.91169042
    V3.G4 -1.7187273  1.87264084  0.50398660  0.55614330
    V4.G1 -0.7539629 -0.51942365 -1.10766476 -0.13609317
    V4.G2  0.3287929  0.82007753  0.92421682 -1.56724742
    V4.G3  2.3035759  0.84197290 -0.06627759  1.12355210
    V4.G4 -0.4388392 -0.33016792  1.07265671  0.79741575
    mca.ans$rs と mca.ans$cs および corresp.ans$rscore と corresp.ans$cscore の値は全く異なるように見えるが,両者の比を取ってみれば,同じであることがわかる。
    要するに定数倍になっているだけ。(定数倍になっていないようなら,あなたの使い方が悪い証拠)
    > options(digits=15)
    > mca.ans$rs / corresp.ans$rscore
                        1                   2                  3                   4
    1  0.0417731277160878 -0.0399877564039938 0.0361837189716289 -0.0326473788200238
    2  0.0417731277160868 -0.0399877564039941 0.0361837189716296 -0.0326473788200223
    3  0.0417731277160874 -0.0399877564039920 0.0361837189716295 -0.0326473788200222
    4  0.0417731277160871 -0.0399877564039938 0.0361837189716303 -0.0326473788200232
    5  0.0417731277160877 -0.0399877564039937 0.0361837189716316 -0.0326473788200234
    6  0.0417731277160869 -0.0399877564039944 0.0361837189716289 -0.0326473788200271
    7  0.0417731277160865 -0.0399877564039941 0.0361837189716286 -0.0326473788200237
    8  0.0417731277160877 -0.0399877564039935 0.0361837189716295 -0.0326473788200248
    9  0.0417731277160847 -0.0399877564039941 0.0361837189716293 -0.0326473788200123
    10 0.0417731277160868 -0.0399877564039947 0.0361837189716291 -0.0326473788200238
    11 0.0417731277160871 -0.0399877564039930 0.0361837189716277 -0.0326473788200234
    12 0.0417731277160859 -0.0399877564039937 0.0361837189716307 -0.0326473788200232
    13 0.0417731277160864 -0.0399877564039939 0.0361837189716297 -0.0326473788200247
    14 0.0417731277160870 -0.0399877564039879 0.0361837189716300 -0.0326473788200230
    15 0.0417731277160864 -0.0399877564040110 0.0361837189716298 -0.0326473788200229
    16 0.0417731277160875 -0.0399877564039929 0.0361837189716293 -0.0326473788200240
    17 0.0417731277160872 -0.0399877564039935 0.0361837189716299 -0.0326473788200231
    18 0.0417731277160870 -0.0399877564039893 0.0361837189716294 -0.0326473788200265
    19 0.0417731277160868 -0.0399877564039947 0.0361837189716291 -0.0326473788200239
    20 0.0417731277160878 -0.0399877564039938 0.0361837189716294 -0.0326473788200229
    > mca.ans$cs / corresp.ans$cscore
                           1                   2                  3                   4
    V1.G1 0.0559016994374954 -0.0559016994374948 0.0559016994374943 -0.0559016994374964
    V1.G2 0.0559016994374953 -0.0559016994375155 0.0559016994374948 -0.0559016994374922
    V1.G3 0.0559016994374948 -0.0559016994374923 0.0559016994374962 -0.0559016994374943
    V1.G4 0.0559016994374905 -0.0559016994374947 0.0559016994374959 -0.0559016994374945
    V2.G1 0.0559016994374944 -0.0559016994374951 0.0559016994374953 -0.0559016994374897
    V2.G2 0.0559016994374958 -0.0559016994374951 0.0559016994374939 -0.0559016994374952
    V2.G3 0.0559016994374949 -0.0559016994374948 0.0559016994374959 -0.0559016994374945
    V2.G4 0.0559016994374930 -0.0559016994374950 0.0559016994374945 -0.0559016994374919
    V3.G1 0.0559016994374958 -0.0559016994374944 0.0559016994374945 -0.0559016994374952
    V3.G2 0.0559016994374948 -0.0559016994374915 0.0559016994374895 -0.0559016994374948
    V3.G3 0.0559016994374961 -0.0559016994374948 0.0559016994374939 -0.0559016994374954
    V3.G4 0.0559016994374943 -0.0559016994374951 0.0559016994374963 -0.0559016994374945
    V4.G1 0.0559016994374952 -0.0559016994374937 0.0559016994374949 -0.0559016994374900
    V4.G2 0.0559016994374959 -0.0559016994374942 0.0559016994374941 -0.0559016994374954
    V4.G3 0.0559016994374950 -0.0559016994374936 0.0559016994374833 -0.0559016994374949
    V4.G4 0.0559016994374950 -0.0559016994374947 0.0559016994374950 -0.0559016994374943
  • ほんとうにありがとうございます。 具体的な数字で理解できました。 参考にさせていただきます -- 田中? 2015-01-13 (火) 15:38:34

C言語で書かれた関数をRから呼び出す方法

toyan? (2015-01-05 (月) 15:16:22)

お世話になります。

環境は、
R version 3.1.1 (2014-07-10)
OS:Windows 7
Platform: i386-w64-mingw32/i386 (32-bit)
です。

パッケージmgcvの関数smooth.construct.cr.smooth.spec()を若干書き換えて使用したいと思っています。ソースファイルsmooth.rのうち、該当部分に修正を加えて、実行しようとしたところ、

 oo <- .C(C_crspl,x=as.double(x),n=as.integer(nx),xk=as.double(k),
          nk=as.integer(nk),X=as.double(X),S=as.double(S),
          F=as.double(F),Fsupplied=as.integer(F.supplied))

のところで、引っかかってしまい、

以下にエラー my.cr(x, knots = kn) :  オブジェクト 'C_crspl' がありません

というメッセージが出て実行できません。Cのソースファイルmgcv.cを見ると、void crspl()という関数が目的の関数のようなので、上記のC_crsplをcrsplに書き換えてみても同じようなエラーメッセージが出てしまいます。"crspl"と文字列に変えてみても同様です。

パッケージmgcvのlibフォルダにあるmgcv.dllファイルをdyn.loadで読み込もうとしても、

> dyn.load("c:/r/library/mgcv/libs/i386/mgcv.dll")
> is.loaded("mgcv")
[1] FALSE

となって、必要なライブラリが読み込めていないようです。

このように、必要なC関数をRから読み込むにはどうしたらよろしいのでしょうか?
初歩的な質問で恐縮ですが、御教示のほどよろしくお願い申し上げます。

  • 最小限の再現サンプルを示していないので確認のしようがないが、まず、最初の一歩としてnamespaceを勉強されたらいかがだろう。その上で、C_crsplの代わりにmgcv:::C_crsplと書いてみるとか。解決してもまた別のところで引っかかるとは思うが。加えてloadNamespace()やattachNamespace()のヘルプも参照されよ -- 2015-01-05 (月) 17:33:55
  • mgcv:::C_crspでうまくいきました。ありがとうございました。これからnamespaceについても勉強していくつもりです。 -- toyan? 2015-01-06 (火) 11:21:19

統計分析の結果の記載法

Beginner? (2015-01-03 (土) 15:38:57)

two-way anovaの結果で独立変数1の自由度が7, 独立変数2の自由度が1でresidualsの自由度が87の結果が出ました。これに関してF値を記載する場合はどうすればよいのでしょうか。
F値にはanova(aov(x~y))のような独立変数一つの値を用いるべきなのでしょうか。
周りによく知っている人が居らず書籍もなかなか見つからずで困っています。
どうか教えて頂ければ幸いです。

  • 独立変数というより,要因と言った方がよいでしょうが,要因ごとにF値(第1自由度,第2自由度),P値を書くべきでしょう?
    書籍もなかなか見つからず,なんてことはいまどき理由にならないでしょう。インターネットで「二元配置分散分析」をキーワードにして検索すれば,計算例も含めたくさんのページが見つかるでしょう。
    http://www.ipc.shimane-u.ac.jp/food/kobayasi/kurikaesinoarunigenhaiti%20excel.htm でもご覧になれば? -- 河童の屁は,河童にあらず,屁である。? 2015-01-03 (土) 16:14:04

twitteRのOAuth認証について

? (2014-12-31 (水) 04:17:37)

windows7 64bit R 3.1.2
R言語でTwitterを操作する
このサイトに沿って、Oauth認証を試みてます。

registerTwitterOAuth(cred)
[1] TRUE

まではいけたのですが、

userTimeline("mima_ita",cainfo="cacert.pem")
[1] "Authorization Required"
Error in twInterfaceObj$doAPICall(cmd, params, method, ...) : 
  Error: Authorization Required

となってしまいます。ログインが上手く言っていないということはわかるのですが、

registerTwitterOAuth(cred)
[1] TRUE

となっているので、なぜログインができていない状態になっているのかがわかりません。どうすればログイン状態にできるでしょうか?


月毎の平均値の出しかたについて

はなちゃん? (2014-12-30 (火) 17:08:04)

エクセル上に,日ごとのデータが100年分約36000個あります.
このデータの月毎の平均値を,上から計算していくことはできないでしょうか?
コピーペーストで1ヶ月毎に平均していくと1200回やる必要があり大変です。
Rでできないでしょうか?エクセルでもいいのですが。

  • 何年何月何日のデータというのがちゃんと分かっているのでしょうか?欠損値があるときはどのようになっているのでしょうか?そんなことにはお構いなく,月はどうでもよいから先頭から順に30日分のデータの平均値を求めたいのか?プログラムの仕様をはっきりしてくれないと。無駄骨折りはしたくないので。
    確実に言えることは,「Excel でやるなんて止めた方がよい(VBA使うにしても)」ということ。Excel じゃなければ,別に,R でなくてもよいでしょうしね。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-30 (火) 17:38:34
  • ご回答ありがとうございます。Ap1932.csvファイルを添付しました.1列目が年月日で19320101から始まっています。2列目がデータで欠損値はありません.これらのデータから,1932年1月,2月....2014年11月までの月平均値を求めたいのです。どうぞよろしくお願い致します。 -- はなちゃん? 2014-12-30 (火) 19:12:18
  • > Ap1932.csvファイルを添付しました
    されてないようですね -- 河童の屁は,河童にあらず,屁である。? 2014-12-30 (火) 21:17:55
    EXCEL のデータ!!を test.csv というファイルに CSV として保存したファイルが以下のようならば,
    date,value
    19320101,4
    19320102,5
    19320103,7
    19320104,9
    19320105,8
    19320106,9
    19320201,5
    19320201,14
    19320202,15
    19320203,17
    19320304,19
    19320405,18
    19320406,19
    19320401,15
    以下の 2 行で片付くでしょう
    d <- read.csv("test.csv")
    by(d$value, d$date%/%100, mean)
  • 添付されていなかったようですみません.添付のタイミングがわかりません。この文章を入れた後すぐにファイルAp1932.csvを添付します。よろしくお願いします。 -- はなちゃん? 2014-12-30 (火) 21:55:40
  • 河童さんありがとうございました.うまくいきました.たった2行で驚きです。月によっては28,29,30,31日とあるのにどのようにプログラムでは判断されてるのでしょうか。あと,計算された月平均値だけを一列に並べる方法を教えてください。よろしくお願いします。 -- はなちゃん? 2014-12-31 (水) 08:31:49
  • > 計算された月平均値だけを一列に並べる方法
    c(by(d$value, d$date%/%100, mean)) とするだけ
    さらに,名前も要らないというならば
    unname(c(by(d$value, d$date%/%100, mean))) -- 河童の屁は,河童にあらず,屁である。? 2014-12-31 (水) 11:36:25
  • 平均値だけになり順番に並べることができました。河童さん本当にありがとうございました.Rで平均値を表示させると,16個数字が横に並ぶ表のような表示になります。これを始めから縦に1列に並べることはできますか?現在は,別のプログラムで,表を1列に直しています。 -- はなちゃん? 2014-12-31 (水) 15:50:12
  • あ,列に並べるのね。cbind(unname(c(by(d$value, d$date%/%100, mean)))) でどうぞ。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-31 (水) 17:05:30
  • 河童さんありがとう.もっと早くから知っていたらずいぶん楽ができたと思いました。得られた結果に,cbind( )をつけるだけなんですね。それにしてもRは少ない命令で良く仕事をしてくれます。 -- はなちゃん? 2014-12-31 (水) 22:29:38

caretの使用について

ランティス? (2014-12-17 (水) 19:21:21)

初歩的な質問だったら申し訳ありません。
過去ログを検索したところ、同様の症状が見られなかった為、質問させていただきます。
caretパッケージをインストールした後、libraryコマンドを使用してパッケージを使用できる状態にしようとしたところ以下のエラーが発生しました。
環境:

OS windows 7 64bit
Rver: 3.1.2

コード:

install.packages("caret", dependencies = T)
library(caret)

エラー:

library(caret)
 要求されたパッケージ lattice をロード中です 
Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : 
   ‘minqa’ という名前のパッケージはありません 
Error:  ‘caret’ に対するパッケージもしくは名前空間のロードが失敗しました 

行った対応:
? install.packagesを使用して再度
? GUIのInstallPackages?で再インストール
? library()コマンドでライブラリー内にcaretがあるか確認(ありました。)

以上です。
よろしくお願い致します。

  • 「‘minqa’ という名前のパッケージはありません」といわれているのだから,「library()コマンドでライブラリー内にcaretがあるか確認(ありました。)」は意味がありませんね。minqa があるかないを確認してください。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-18 (木) 08:17:39
  • 返信ありがとうございます。確認したところ、「minqa」が無かった為installを行ったところ、無事caretが利用できる事を確認しました。参考書では特にこれらのパッケージをインストールするコードは書いて無かったのですが、互いに参照し合うパッケージもあるのですね・・・。勉強になりました。ありがとうございます! -- ランティス? 2014-12-18 (木) 10:27:52
  • dependencies は install.packages の中で,解決するように指定している(つもり)でしょう。ただ,dependencies = T とやってしまっているので,T がその時点でなんだったのか不明なので,依存関係を解決できなかったのでしょう。TRUE を T と省略してしまったのが原因かもしれないということです。(いずれにしろ,時間の節約のために,エラーメッセージや,引数での指定が何を意味しているかもう少し考えるようにしましょう) -- 河童の屁は,河童にあらず,屁である。? 2014-12-18 (木) 19:47:19
  • 補足の説明ありがとうございます。エラー内容を読めば解決できた問題でしたね・・・。今後は参考書のサンプルコードを鵜呑みにせず、意味を解いていきたいと思います。 -- ランティス? 2014-12-19 (金) 11:45:55

plotMeans() {Rcmdr}で作成したグラフ内の凡例編集について

おこめ? (2014-12-17 (水) 16:06:46)

パッケージRcmdrを読み込んだのちplotMeans() を用いて2つの処理についての結果をグラフ化しました。
その際自動で凡例も挿入されるのですが、この凡例の編集(位置やフォントサイズ変更)がどうしてもできません。
また、legend() を用いると新たに別の凡例がグラフ内に挿入されてしまいます。

ぞ同挿入の凡例について、唯一凡例タイトルだけは

plotMeans(x$測定値,x$処理1,x$処理2,error.bars="se",legend.lab="xxx")

と書くことで変えることができました。
ですが特に編集したいフォントサイズについては編集方法がまったくわかりません。
検索していろいろ調べたのですが手がかりがつかめませんでした。

この自動で挿入される凡例の編集方法についてアドバイスいただけませんでしょうか。
どうぞよろしくお願いします。

  • やはりRcmdrだと回答がありませんね。plotMeans()の定義を見ると凡例のpchとcol以外は固定されており、ユーザの操作で変更できるものではありません。Rcmdrのユーザ層は凡例の位置やフォントサイズを変更するような層ではないのでしょう。凡例を自由に変更したいのであれば、Rcmdrを経由するのではなく普通にRを使えばよいと思います。例えば下記のようにプロットするとか(欠損値に対応していないので注意)。 -- 2014-12-19 (金) 11:55:07
    data(Moore, package="car")
    interaction.plot(response = Moore$conformity, x.factor = Moore$fcategory,
                     trace.factor = Moore$partner.status, pch = 19,
                     col = 2:3, type = "b", lty = 1:2, legend = FALSE,
                     ylim = c(0, 25))
    i <- interaction(Moore$fcategory,Moore$partner.status)
    m <- by(Moore$conformity, i, mean)
    se <- by(Moore$conformity, i, function(x){sd(x)/sqrt(length(x))})
    n1 <- nlevels(Moore$fcategory)
    n2 <- nlevels(Moore$partner.status)
    arrows(rep(1:n1, n2), m - 1.96 * se, rep(1:n1, n2), m + 1.96 * se,
           col = c(rep(2, n1), rep(3, n1)), code = 3, angle = 90,
           length = .1)
    legend("topleft",                       #位置
           levels(Moore$partner.status),
           cex = 2,                         #フォントサイズ
           pch = 19,
           pt.cex = 1,
           col = 2:3, lty = 1:2, bty = "n")
    plotMeans01.png
  • ありがとうございます!とても勉強になりました。凡例も編集したいので、Rで思い通りにグラフを描けるようにきちんと勉強します。 -- おこめ? 2014-12-20 (土) 15:55:36

glmmMLの後にstepAIC

lin? (2014-12-15 (月) 15:44:48)

glmmMLの後にstepAICを行うと

以下にエラー if (all(is.finite(c(n0, nnew))) && nnew != n0) stop("number of rows in use has changed: remove missing values?") : 
  TRUE/FALSE が必要なところが欠損値です

と出るのですが、glmmMLにはstepAICは出来ないのでしょうか?

  • 少なくとも,あなたのデータに対しては適用できないと考えるのが普通でしょう。
    あなたの,実際のデータ(あるいは現象を再現できる最小限のデータが)が提示されれば,ちゃんとしたが判断が出来るでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-15 (月) 21:23:00
  • 質問者ではありませんが、最小限データを提示します。 -- 2014-12-16 (火) 17:23:25
    > dat <- data.frame(y = rbinom(100, prob = rep(runif(20), rep(5, 20)), size = 1), x1 = rnorm(100), x2 = rnorm(100), id = factor(rep(1:20, rep(5, 20))))
    > stepAIC(glmmML(y ~ x1 + x2, data = dat, cluster = id))
    Start:  AIC=129.09
    y ~ x1 + x2 
    
     以下にエラー if (all(is.finite(c(n0, nnew))) && nnew != n0) stop("number of rows in use has changed: remove missing values?") :
       TRUE/FALSE が必要なところが欠損値です
    なお、北大の久保先生の日記(2003年11月05日)によると「glmmML の現時点での問題点だが…ついでに当然のごとくに stepAIC() とか使えん. これは自作するしかないなあ」だそうです。10年以上前の話なので現在はわかりませんが。
  • stepAIC から呼ばれる nobs.glmmML が,存在しない要素 n を取り出そうとしているので,戻り値が NULL になるので,nnew != n0 が NULL になり,エラーになる。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-16 (火) 17:52:37
    > glmmML:::nobs.glmmML
    function (object, ...) 
    {
        object$n
    }
    > names(object)
     [1] "boot"                  "converged"             "coefficients"         
     [4] "coef.sd"               "sigma"                 "sigma.sd"             
     [7] "variance"              "aic"                   "bootP"                
    [10] "deviance"              "df.residual"           "cluster.null.deviance"
    [13] "cluster.null.df"       "posterior.modes"       "prior"                
    [16] "terms"                 "info"                  "call"
  • > stepAIC() とか使えん. これは自作するしかないなあ. いやはやー
    自作したんですかなあ.いやはやー
    とりあえず動くようにするには,以下のようにやる。
    しかし,本当に正しいかどうかは保障しない。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-16 (火) 18:36:06
    > sink("glmmML.R")
    > glmmML:::glmmML
    > sink()
    作業ディレクトリに保存された glmmML.R を編集する
     先頭に glmmML <- を加える
    glmmML <- function (formula, family = binomial, data, cluster, weights, 
     プログラムの最後の方に 1 行加える
     末尾 1 行をコメントアウトする
        class(res) <- "glmmML"
        res$n <- nrow(data) # この行を追加
        res
    }
    # <environment: namespace:glmmML> # コメントアウト(もしくは削除)
    glmmML を使う前に,source("glmmML.R") を実行する。
    > source("glmmML.R")
    > dat <- data.frame(y = rbinom(100, prob = rep(runif(20), rep(5, 20)), size = 1),
      x1 = rnorm(100), x2 = rnorm(100), id = factor(rep(1:20, rep(5, 20))))
    > stepAIC(glmmML(y ~ x1 + x2, data = dat, cluster = id))
    Start:  AIC=132.29
    y ~ x1 + x2
    
           Df    AIC
    - x1    1 131.06
    <none>    132.29
    - x2    1 133.73
    
    Step:  AIC=131.06
    y ~ x2
    
           Df    AIC
    <none>    131.06
    - x2    1 132.27
    
    Call:  glmmML(formula = y ~ x2, data = dat, cluster = id)    
    
    
                   coef se(coef)       z Pr(>|z|)
    (Intercept)  0.2267   0.4243  0.5344   0.5930
    x2          -0.4534   0.2645 -1.7144   0.0865
    
    Scale parameter in mixing distribution:  1.513 gaussian 
    Std. Error:                              0.4668 
    
            LR p-value for H_0: sigma = 0:  0.0003127 
    
    Residual deviance: 125.1 on 97 degrees of freedom
      AIC: 131.1 
    

githubのzipファイルをダウンロードしてのインストール

時計? (2014-12-15 (月) 15:09:47)

お世話になります。
標記につきまして、devtool::install_githubがプロキシの関係で使えないので、zipファイルをダウンロードして、パッケージをインストールしています。
以前、ggbiplotをインストールしたことがあるのですが、やり方を失念してしまいました。
Google先生に聞いてみても、うまく、記事を捕まえきれません。
お忙しいところご迷惑おかけいたしますが、どうぞご教授ください。

  • すみません、自己解決しました。パッケージに同梱されている。Rstudioのプロジェクトファイルを開いて、Rstudioのbuiltでいけました。ご迷惑おかけいたしました。 -- 時計? 2014-12-16 (火) 15:35:45

qccでの管理図表示における横軸について

QCUSER? (2014-12-03 (水) 18:20:35)

qccを用いて管理図を表示させることを試みています。
qccコマンドの使用方法について質問させてください。

質問概要

qcc.groups(data , sample)

にてグループ化したmatrixを元にqccで管理図を表示する場合、横軸にデータ値のサンプル指標(第二引数sampleの値)を表示することはできますでしょうか?


タブ区切りのファイル「01_INPUT.txt」にロット、data01という列が存在した場合

inputdata <- read.table("01_INPUT.txt", header=TRUE, sep = '\t')
attach(inputdata)
samplegrp <- qcc.groups(data01, ロット)

によってマトリクス「samplegrp」が生成できます

> samplegrp
 305-0 306-0 307-0 308-0 309-0 310-0 311-0 312-0 313-0 314-0 315-0 316-0
 [1,] 52.89 52.93 53.06 53.06 53.02 53.08 53.12 52.95  52.8 52.93 52.95 53.02
 317-0 318-0 319-0 320-0 321-0 322-0 323-0 324-0 325-0 326-0 327-0 328-0
 [1,] 53.02 52.91 52.97    53 53.07 53.09 53.09 53.04 53.04 53.04 53.08  53.1
:

このマトリクスを用いてqccコマンドにより管理図が表示されます

qcc(samplegrp, type="xbar.one", nsigmas=3, title="X管理図")

しかしながら、"ロット"(上記サンプルデータでは'305-0'や'306-0')を横軸に表記する手段がわからない状態です。

  • 管理図のこととか qcc とか,私にはよくわかりませんが
    qcc(samplegrp[1,], type="xbar.one", nsigmas=3, title="X管理図")
    としたときに出力される図でよいんでしょうか?? -- 河童の屁は,河童にあらず,屁である。? 2014-12-03 (水) 19:06:22
  • 即答頂きありがとうございました。アドバイス頂いた通りの方法で思ったグラフ(管理図)を表示することができました。 -- QCUSER? 2014-12-03 (水) 19:53:01

Rの出力について

Ryo? (2014-12-02 (火) 17:38:50)

Rの仕様で計算結果が長い場合、ウインドウの大きさに合わせて結果が区切られたりします。それを区切らせないで結果を表示することは可能でしょうか。
(Rの結果の表示のウインドウの大きさを変更できますか?)
ABC
DEF
GHI
ではなくて
ABCDEFGHI
とtxtに保存したいです。
宜しくお願いします。

  • 表示と保存は別物ですが?また,1行の表示桁数を増やす必要があるなら,options(width=お好きな数字) とすればよいだけですよ。? options として,ご覧じろ。 -- 河童の屁は,河童にあらず,屁である。? 2014-12-02 (火) 21:06:22
  • 河童の屁は,河童にあらず,屁である。 さん、出来ました。ありがとうございました! -- Ryo? 2014-12-02 (火) 22:35:05

関数"RMeCabDf?"を見つけることができません。

初心者X? (2014-11-25 (火) 23:59:08)

# library(RMeCab)
Q1 <- RMeCabDF(dat, 3)

のようにしたら題名のようにエラーになりました。
datの中身は、ここでは書いていませんが代入しております。

どうしたらいいのでしょうか?

  • 関数がないと言われているのだから,library 関数が正しく機能していないとか,RMeCab? 自体が正しくインストールできていないとか。
    library(RMeCab?) がコメントアウトされているからというような単純なことじゃないわけですね。
    だとすれば次のチェックですが ,RMeCab? は,正しくインストールされているんですか? -- 河童の屁は,河童にあらず,屁である。? 2014-11-26 (水) 00:18:46

heatmapでの色の割り振りについて

kana? (2014-11-20 (木) 16:11:13)

heatmap関数を使っているのですが、ある一つの要素の値が突出して高いために、他の要素のカラーの違いが見分けられません・・・
「ある値以上では色が一定、それ以下はグラデーションで表示」にしたいのですが、どのようにしたら良いのか教えてもらえると助かります。

  • よくわからないですが,その「ある一つの要素の値」をほどほどの値に変換してから図を描くというので十分では? -- 河童の屁は,河童にあらず,屁である。? 2014-11-20 (木) 18:19:32

パネルデータでのエラー

? (2014-11-19 (水) 17:12:27)

R超初心者です。Rcmdr(Rコマンダー)を使っています。
プーリングによるパネルデータ分析を試みているのですが、データ読み込み後

library("plm")
res_po <- plm(従属変数 ~ 独立変数A+独立変数B・・・ +独立変数X,
              data=データ名, model="pooling")
summary(res_po)

と入力して行っています。
ところが、Rコマンダーで「エラー」とだけ表示されてしまい、それが何のエラーかもわからないでいます。
他のデータセットではこれでパネルデータ分析できたのですが、なぜこちらではできないのでしょうか。
データセット自体は数値以外は入力されていません。

  • 「なぜこちらではできないのでしょうか」といわれても,「こちらのデータ」がどんなのか分からないので,回答不能でしょう。
    上の「フィアル添付」で,データをアップロードしてみればいかが?
    OS, R, Rcommander のバージョンを明記することも忘れずに。 -- 河童の屁は,河童にあらず,屁である。? 2014-11-19 (水) 19:18:05

gsub で _ を . に変えたい

かな? (2014-11-15 (土) 03:33:38)

"test_1", "test____2" など 数が不定な _ を全て1つの . に変えたいと思います。 "test.1" "test.2" としたいということです。

gsub('[_]{+}', '.', c("test_1", "test____2"))

とやってみましたが、できあがりの読点の数が1つになりません。ご教示よろしくお願いします。

  • gsub('_+', '.', c("test_1", "test____2")) でしょう(' と " はを使い分ける必要はないですけど)
    [_] でもいいけど,冗長。{+} は完全に誤用。{1,} ならよいけど,それも冗長。 -- 河童の屁は,河童にあらず,屁である。? 2014-11-15 (土) 08:09:36
  • Thank you very much! -- かな? 2014-11-27 (木) 02:27:36

メモリ上限について

3M? (2014-11-13 (木) 10:18:27)

Windows 7 64bit版でRを使いたいのですが、Rが使用できるメモリの上限はいくつになるのでしょうか。32bit版と同じ2GBでしょうか。

宜しくお願いします。

  • help("Memory-limits") を参照 -- 2014-11-13 (木) 13:43:56
  • ありがとうございます。8TBまで搭載できるとは驚きました。そこまでたくさん搭載することはないと思いますが。 -- 3M? 2014-11-13 (木) 16:29:40

【ベン図】データサイズを領域の面積に反映する

Steps? (2014-11-12 (水) 15:10:04)

はじめて,投稿をさせて頂きます。

RでVenn Diagramを作成したいのですが,下記のように,

library(VennDiagram)
   draw.triple.venn(10,5,4,2,3,1,1, ind=TRUE, scaled=TRUE)

と【scaled=TRUE】としてもデータサイズを領域の面積に反映することができません。

どのようにすれば,データサイズを反映した円のサイズにすることができるのでしょうか?
よろしくお願いいたします。

  • 円を使う限り,データサイズを面積に反映することは不可能でしょう。少なくともどんなデータサイズであっても面積に反映できるということはないでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-11-12 (水) 17:02:35
  • ヘルプには「N.B. General scaling for three-set Venn diagrams are disabled due to potentially misleading visual representation of the data. To re-enable, assign any value to variable ‘overrideTriple’.」と書かれており、実際、draw.triple.vennの中を見ると下記のように半径を決めています。 -- 2014-11-12 (水) 17:09:18
       if (!exists("overrideTriple")) {
           r1 <- sqrt(100/pi)
           r2 <- r1
           r3 <- r1
       }
       else {
           r1 <- sqrt(area1/pi)
           r2 <- sqrt(area2/pi)
           r3 <- sqrt(area3/pi)
       }
  • あ,「3つの円の面積」がサンプルサイズを反映するようにということか。でも,あんまり,メリットなさそう。 -- 河童の屁は,河童にあらず,屁である。? 2014-11-12 (水) 17:14:23
  • 質問者のニーズによっては、メリットがあることもあるかも。-- 2014-11-12 (水) 17:56:28
    > overrideTriple <- TRUE
    > grid.newpage(); draw.triple.venn(100,150,200,20,30,10,1)
    draw.triple.venn.png
    draw.triple.venn()は作りが甘く、中でハードコーディングが散見され、サンプルの組み合わせ次第では、大きさは変化しません。面積に対応させたベン図描画は、隠し機能程度に捉えた方がよいと思います。

多次元尺度構成法(isoMDS)で扱えるデータ件数について

ゆき? (2014-10-26 (日) 13:35:40)

初めまして。
Rの多次元尺度構成法で扱えるデータ件数について質問があります。
6万件のデータ間の類似度(小数)をインプットにして多次元尺度構成法(isoMDS)を実行したところ、以下のようなエラーが表示されスクリプトが終了しました。

invalid value of 'n'

isoMDSは以下のような呼び出しをしております。

a <- read.csv(input, h=T, as.is=T, row=1, check.names=F)
mds <- isoMDS(a, trace=F)

エラーメッセージをもとにgoogleで検索していたら、isoMDSの中から実行されているcmdscaleにデータ件数のチェックが入っており、46340件を超えると終了しているようです。
http://code.metager.de/source/xref/gnu/R/src/library/stats/R/cmdscale.Rの43行目)

if(is.na(n) || n > 46340) stop("invalid value of 'n'")

isoMDS以外ではどうかと思い、sammon、metaMDSでも同じデータをインプットにして試してみたのですが、上記のcmdscaleの件数チェックでひっかかり終了となってしまいました。
Rの関数を使って多次元尺度構成法を行う場合、46340件以上のデータを扱う方法はあるのでしょうか?
よろしくお願いします。

  • どうしても分析をしたいのであれば,if(is.na(n) || n > 46340) stop("invalid value of 'n'") を無効にする,あるいはあなたの場合,少なくとも n > 60000 とかにすればよいだけですが,はたしてそのようにしたとき,メモリーの制約に触れないかどうかは私にはわかりません。Windows の場合は,普通の UNIX の場合より条件が緩いのか強いのかも分かりません。
    60000 ともなれば,分析結果を表示・解釈するのもかなりの困難が予想されると思いますが,そのあたりは大丈夫ですか?試しに60000のサンプルから46340程度を無作為抽出して,そのデータを分析してみて,計算時間がどれくらいになるのか,結果がどんな風になるか,どんな風に表示されるのか,などなど,を試してみるのも,よい経験になるのではないでしょうか?
    老婆心ながら FALSE/TRUE を F/T と略記する癖は直しておいた方がよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-10-26 (日) 20:02:58
  • ひとまずif文の制限を緩くして検証してみるしかないのですね。これまで測定してきた結果から推測すると、60000件だと計算には1日くらいかかると想定しています。制限をはずして実行してみて、結果がどうなるかも含めて確認をしてみます。 また、TRUE/FALSEの書き方についてもご指摘いただき、ありがとうございます。今後は注意します。 お返事いただき、ありがとうございました。 -- ゆき? 2014-10-27 (月) 07:36:14
  • 46340と言うのは 要素数2^31-1に収まる行列の行および列になります. これを越えると無関係のデーターを参照(結果はゴミ)したり落ちたりします. RのBLAS,LAPACKはint4(32bit)固定なので, ご自分でフォートラン例えばgfortranなら`-fdefault-integer-8' とかをBLAS&LAPACKに指定して作ったライブラリを用意して固有値分解を行うと言ったような事をしないとならないと思います. -- なかま 2014-10-27 (月) 16:26:25
  • 46340の制限は、BLAS&LAPACKが影響しているのですね。情報をご提供いただき、ありがとうございます。 -- ゆき? 2014-11-05 (水) 09:27:37

CPUのコアについて

こあら? (2014-10-17 (金) 08:29:34)

お世話になります。Rのコアへの割り当てについて疑問があります。

デュアルコアのCPUを搭載したパソコンでRを使用しているのですが、Rはひとつのコアしか使用しないという話を伺いました。では、Rを2つ起動するとひとつずつのコアを使うことになるのでしょうか。それともひとつのコアを2つのRで共有するのでしょうか。

宜しくお願いします。

  • Linux環境では2つ起動するとひとつずつ使っているように見えますが、OSが制御している部分なので他のプロセスの状況によっては異なるかもしれません。multcoreパッケージを使ったり、snowパッケージでtype="SOCK"のクラスターを組んだりすると確実にひとつずつ使う計算ができると思います -- 2014-10-28 (火) 06:34:50

パッケージplsのCVのkは変更可能?

えーけん? (2014-10-16 (木) 16:21:37)

初めまして。
Windows7 で R x64 3.1.1を使用しています。

現在、Rでplsを実行しておりますが、
データのサンプル数によって、クロスバリデーションの分割数kを変更したいのです。
それは可能でしょうか?可能でしたら、方法を教えていただきたいです。
よろしくお願いします。

  • マニュアルに書いてあるんじゃないかな?
    If validation = "CV", cross-validation is performed. The number and type of cross-validation segments are specified with the arguments segments and segment.type. See mvrCv for details. -- 河童の屁は,河童にあらず,屁である。? 2014-10-16 (木) 16:30:19
  • お返事ありがとうございます。マニュアルみてみます! -- えーけん? 2014-10-17 (金) 14:21:44
  • 正確に言うと,私が「マニュアル」といったのは「オンラインヘルプ」のこと。しかし,まあ,なんですなあ,オンラインヘルプも見ないで質問したわけ?? -- 河童の屁は,河童にあらず,屁である。? 2014-10-17 (金) 21:45:21
  • すみません。調査不足でした。 -- えーけん? 2014-10-18 (土) 14:36:40

e1071のsvm()でcrossを指定した場合のモデルについて

ひろ? (2014-10-13 (月) 10:21:08)

初めて投稿します.
Mac OS X上でR 3.1.0を使用しています.

e1071パッケージのsvm関数について分からない点が有ります.
e1071のソースファイルsvm.RやRsvm.cもあたりましたが,
何となくやっていることは分かりますが,詳細まで理解することは出来ませんでした.
なので,ここで質問させていただきます.
詳しい方がおられましたらご教授ください.

次のように 10-fold cross validationでsvmのモデルを構築するとします.
model<-svm(factor(V1)~V2+V3+V4, data=testdata, cross=10)

このとき,modelとして出力されるのは,
10回の交差試験で最後に作られたモデルになるのでしょうか?
それとも,10回分の交差試験の結果が反映されたモデルになるのでしょうか?
あるいは私の考えている点がまるで見当違いでしょうか?

よろしくお願いします.

  • svm.R や Rsvm.c なんかは,実装レベルのお話なので,計算過程は分かるかも知れないが,本質の理解の参考にならないでしょう。http://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf あたりにも書いてなかったですか? -- 2014-10-14 (火) 21:33:06
  • 情報ありがとうございます.紹介いただいた論文を読んでみます. -- ひろ? 2014-10-14 (火) 23:14:25

SIARのモデルのラン時のエラー

びぎなー? (2014-09-29 (月) 18:12:11)

初めて投稿します。超初心者です。
利用環境は、windows 8 にてR version 3.1.1と追加パッケージとしてspatstatとsiarをロードしています。

テキストファイルデータの読み込み、生データのプロットはできたのですが、肝心のモデルのランでエラーが出ます。

Selection: 2
Run SIAR for a single group. 
For this you will need to have input successfully some data in option 1. 
In this instance, the target isotope file must be a two column file with
no group label in the first column. 
 
See the demo for more details on this function. 

Press <Enter> to continue...
Choose the size of the model run: 

1: Standard
2: Long
3: Very long

Selection: 1
 以下にエラー siarmcmcdirichletv4(data = siardata$targets,
                                  sources = siardata$sources,  : 
   (list) オブジェクトは 'double' に変換できません 

お手数ですが、ご存じ方、対応、エラー原因についておしらせいただけたらと思います。何卒宜しくお願いします。

  • どのようなデータをどのように分析したか(コンソールにどのように入力したか)が分からないと,解答するのは難しいのでは? -- 河童の屁は,河童にあらず,屁である。? 2014-09-29 (月) 18:54:39
  • コメントありがとうございます。Cドライブにd13Cとd15Nのデータ(txt)を3ついれています。 1つは、targetデータとして捕食者のデータ(1種に関する42個のデータ 3列43行)、もう1つはSourceデータとして検討される被食者のデータ(5列10行)、もう1つは、被食者の栄養濃縮係数のデータ(5列10行)になります。 すべてメモ帳にて、.txtファイル形式で作成しました。 データの読み込みは、siarmenu() から 1: Load to some data (run this first)を選択し、directoryを指定し、プログラムから聞かれる通り、Targetデータ、Sourceデータのファイルを指定、Fraction correctionはないので、無記載でエンターキーを押し、最後にConcentration depenencyのファイルをそれぞれの指定しました。 操作は、Richard Inger, Andrew Jackson, Andrew Parnell & Stuart著SIAR V4 (Stable Isotope Analysis in R) An Ecologist's Guideを参照しながら進めております。 できれば、対象種(1種)へのエサの寄与率(主な餌の推定)を把握するため、できれば、それぞれのエサの占有密度を見たい考えです。 どうぞ宜しくお願いします。 -- びぎなー? 2014-09-30 (火) 09:35:45
  • これだけの情報では,追試はできませんね。しかし,メッセージに"In this instance, the target isotope file must be a two column file with no group label in the first column."といわれているのに,あなたのデータファイルには(どれがどれに対応するのかも分かりませんが)2列のものがないようですが。 -- 河童の屁は,河童にあらず,屁である。? 2014-09-30 (火) 10:10:34
  • もし、真に解決を望むのであれば、架空のデータなどを用いてエラーを再現できるMWE (minimal working example)の提示が必要です。また、経験則で申し上げると、トラブルの9割方は、MWEの準備を通じて自己解決するでしょう。参考:How to Ask for Help using R -- 2014-09-30 (火) 10:35:05
  • ご回答、コメントありがとうございます。Targetのファイルを2列データにして試しましたが、うまくいきませんでした。もともと複数種を見ようとしていましたので、他種のデータをいれて、1列目の項目を参照文献で指定されてあったCodeからGroupに変更して読み込み、プログラムを走らせると、走ってくれました。お尋ねする前にもっと見直す必要がある点、勉強させていただきました。お恥ずかしい限りです。お時間、お知恵を拝借して恐縮です。コメントいただいた皆様、どうもありがとうございました。取り急ぎ、お礼まで。 -- びぎなー? 2014-09-30 (火) 11:06:22

page.rank.oldを使いたいがエラーが出る

たまご? (2014-09-22 (月) 18:17:03)

初めて投稿します。R言語初心者です。
page.rank.old(igraphというパッケージにある)という関数を使いたいのですが,以下のようなエラーが出てしまいます。

> g <- random.graph.game(20, 5/20, directed=TRUE)
> page.rank.old(g)
 [1] 0.06973880 0.09021035 0.03558664 0.01666512 0.07154547
     0.04793332 0.07996897 0.05023446 0.03992723 0.07147081
[11] 0.03138601 0.02566091 0.09408276 0.04552462 0.04179698
     0.03378557 0.00750000 0.02832452 0.09572176 0.02293570
 警告メッセージ: 
In .Call("R_igraph_pagerank_old", graph, vids - 1, directed, niter,  :
  At structural_properties.c:1379 :igraph_pagerank_old is deprecated from
    igraph 0.7, use igraph_pagerank instead

なんとかこのエラーを取り除きたいのです。よろしくお願いします。
Rのバージョン3.1.1
igraphのパッケージは最新
OS windows7

  • "use igraph_pagerank instead" といわれているのだから,素直に従うのが吉
    単純に,そのメッセージを表示させたくないだけならば,事前に options(warn=-1) とでもしておく -- 河童の屁は,河童にあらず,屁である。? 2014-09-22 (月) 19:04:10
  • それは「エラー」ではなく「警告」ですよ。両者の意味は異なります。IT関係の話をするときには両者を厳密に区別して話をしなければなりません。一般的に、警告メッセージは、無視しても問題がありませんが、エラーメッセージは問題があります。また、警告メッセージを表示するかどうかは、好みの問題です。表示させたくないなら、河童さんの助言に従うことになります。 -- 2014-09-23 (火) 15:13:38
  • 回答ありがとうございました。この場合はプログラム自体は行われているのですね。 -- たまご? 2014-09-24 (水) 02:55:55


添付ファイル: filepersp.axes.png 17件 [詳細] file216513.jpg 62件 [詳細] filefreq.png 103件 [詳細] filenomogram.png 144件 [詳細] filetestdata.xlsx 60件 [詳細] filefile_2.pdf 206件 [詳細] filefile_1.pdf 208件 [詳細] filefig.png 366件 [詳細] filedeg.png 331件 [詳細] fileサンプル.png 344件 [詳細] filedata_ANCOVA.csv 127件 [詳細] filesample2.png 353件 [詳細] fileAp1932.csv 127件 [詳細] filedata1.csv 92件 [詳細] filedraw.triple.venn.png 444件 [詳細] fileplotMeans01.png 411件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2016-07-28 (木) 17:16:36 (2h)