統計解析フリーソフト R 【第3章】

このエントリーをはてなブックマークに追加
656635:2010/06/03(木) 17:17:10
いろいろ勉強になります。
少し疑問があるのですが、
リストとデータフレームの違いがイマイチ良く理解できていません。
データフレームはいわゆるエクセルなどのスプレッドシート上のデータ群と
理解しています。
リストはデータフレームよりもフレキシブルなんでしょうか?

リストからデータフレームに変換するのには次の方法で良いのでしょうか?
>x <- list(4:6,7:9,10:12)
>x <-data.frame(x)

宜しくお願い致します。
657132人目の素数さん:2010/06/03(木) 17:48:52
>>656
そのあたりの超入門的なことは、入門書を一読してから尋ねた方がいいと思う。
購入がいやならオンラインでもいろいろとある。

> リストからデータフレームに変換するのには次の方法で良いのでしょうか?
こんなことを聞かれても、欲しいデータフレームがどういうものか見せてくれないと、
答えようがないし、list構造の概念を理解していないからこそ発せられる質問だと思うよ。
> as.data.frame(x)
X4.6 X7.9 X10.12
1 4 7 10
2 5 8 11
3 6 9 12
> as.data.frame(unlist(x))
unlist(x)
1 4
2 5
3 6
4 7
5 8
6 9
7 10
8 11
9 12
どっちもデータフレームだよ。
658635:2010/06/03(木) 18:58:57
>>657
オンラインのものは、- 統計解析ソフトR の備忘録PDF -とか、Rjpwikiとかは一通り読みました。
まだちゃんとは読んでいませんが、英語のR本も何冊か持っています。

今のところの体感認識では、
データフレームは、Rデータエディタで表示すると、きれいにスプレッドシートとして表示される。
リストは、そうでない。

また、リストはリストそのものも要素に扱えるということから、
雑多なデータを寄せ集めて表現しているものという認識で間違っていないでしょうか?

つまり、
データフレーム形式では、行・列の2次元でデータに意味付けされている。
リストでは、そういう縛りがない。

いろいろ丁寧に教えていただき勉強になっています。
ありがとうございます。
659635:2010/06/03(木) 19:18:16
今Rで試してみましたが、
リストはデータフレームそのものも要素になりうるんですね。

リストにデータフレームを1から5まで読み込んで、ひとつのデータフレームにまとめたいときに
>newdataframe<-as.data.frame(original_list)
>newdataframe<-merge(original_list[[1:5]])
上記二つの方法が出来ることがわかりました。
二番目の方法では、列データがまるまる重複するデータは自動的に削除されるので
二番目の方法の方が扱いやすいのかと理解しています。
他の方法などあれば、また教えて下さい。
660635:2010/06/04(金) 12:34:01
自己レスです。
merge()関数は二つのデータフレームしか結合できないようなので、

>newdataframe<-original_list[[1]]
>for(i in 2:5){newdataframe <- merge(newdataframe, original_list[[i]])}
が正しいようでした。
661132人目の素数さん:2010/06/06(日) 11:29:56
Rでのgrepの使い方がいまいちわからん
662132人目の素数さん:2010/06/11(金) 03:23:47
age
663132人目の素数さん:2010/06/12(土) 12:16:16
すみません。助けてください。
下記コマンドでエクセルからデータを取り込みました。
library(foreign)
db <- read.xls("sample.xls", sheet=1)
すると
str(db)
'data.frame': 35 obs. of 38 variables:
$ NO : int 1 2 3 4 5 6 7 8 9 10 ...
$ ID : Factor w/ 35 levels "AA001","AB002",..: 29..
で確かめると要素が文字列(つまりchr)であることが期待された変数IDは、
上記のように因子レベルになっています。

数値を因子に直す方法は、factor(変数名,levels=,labels=c("",""))を使うことは分かったのですが、
因子を文字列に直す方法が分かりません。
宜しくお願い致します。
664132人目の素数さん:2010/06/13(日) 04:29:43
>>663
as.characterでよくね?
665132人目の素数さん:2010/06/15(火) 00:07:36
R+freeBSD環境でインストールしているのですが、
2時間掛かっているのに終わりません。

こんなに時間が掛かるものなのでしょうか?
666132人目の素数さん:2010/06/15(火) 09:58:16
>>665
そんなのマシンによるだろ。
依存ライブラリのコンパイルもしているだろうから、
依存ライブラリが予め入っていないなら+αの時間がかかるし
667132人目の素数さん:2010/06/16(水) 02:40:13
データフレーム(の中身)をsshで別のマシンに送りたいのですが、どうすればいいでしょうか?
> c1<-rnorm(1024);
> x<-data.frame(c1=c1);
> write.csv(x,file="/tmp/data.csv");
> system("cat /tmp/data.csv | ssh [email protected] \"command line\"");
[email protected]'s password:
>
これで一応転送は出来てるのですが、最初のwrite.csvをやらないようにしたい
のですが、やり方がわかりません。出力先をパイプにすればいいのでしょうか?
どうかよろしくお願いします。
668132人目の素数さん:2010/06/16(水) 02:55:12
> sshOut<-pipe('ssh [email protected] \"command line\" &> /tmp/sshOut', open='w');
とかやると出来そうな雰囲気もあるのですが、パイプに出力をうまくかけません。
669132人目の素数さん:2010/06/17(木) 11:42:06
流れを読まずに質問

rownameが付いたデータがあります。
as.vectorでもas.listでもfalseになるので型がよく判りませんが、
数値の入った一次元配列?です。

データが1以下の行は使わないので、0とかNAにしましたが、
そのあとの計算で邪魔になってします。

データが1以下の行を削除するには、どうしたらいいのでしょうか?
調べても判らなかったので、ここを見ろ、でも有り難いです。
670132人目の素数さん:2010/06/17(木) 13:04:09
よくわからないけど
> a <- (1:4)/2
> a
[1] 0.5 1.0 1.5 2.0
> a[a>1]
[1] 1.5 2.0
こういうこと?
671669:2010/06/17(木) 21:34:05
>>670
有難う御座います。
672132人目の素数さん:2010/06/23(水) 14:34:40
質問です。ご回答お願いします。

10行2列のマトリックスAと20行2列のマトリックスBを使って
回帰分析を行いたいんですが、エラーが出ます。

具体的には、A,Bの一列目を従属変数(濃度)、二列目を独立変数(スペクトル)にしてます。
関数lmを使ってAで作った検量線に、関数predictを使ってBの二列目を代入したい
(スペクトルの値から濃度を予測したい)と考えているのですが、
「データ数が違う」という旨の警告が出てできません。

分かりにくいかもしれませんが、宜しくお願いします。
673132人目の素数さん:2010/06/23(水) 15:33:28
>>672
Rjpwikiの方が親切に回答してもらえると思うぞ。
> A <- data.frame(matrix(1:20,nrow=10))
> head(A)
X1 X2
1 1 11
2 2 12
3 3 13
4 4 14
5 5 15
6 6 16
> B <- data.frame(matrix(runif(40),nrow=20))
> head(B)
X1 X2
1 0.6353921 0.2679418
2 0.2917369 0.3124313
3 0.2857031 0.2795522
4 0.1951349 0.4510532
5 0.4426567 0.4894139
6 0.5981174 0.3142484
> predict(lm(X1~X2,A),B)
1 2 3 4 5 6 7 8
-9.732058 -9.687569 -9.720448 -9.548947 -9.510586 -9.685752 -9.718648 -9.481105
9 10 11 12 13 14 15 16
-9.477939 -9.628372 -9.697301 -9.711742 -9.717192 -9.791366 -9.910725 -9.650475
17 18 19 20
-9.903119 -9.638157 -9.547609 -9.051490
ってこと?具体的なコード(再現性のあるサンプルコード)を示してくれないと、
なんで出来ないのかこちらには分からない。
674132人目の素数さん:2010/07/04(日) 01:35:42
nnet使ってるけど、これって出力層のユニット数は変更できないの?
675名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:05:40
fit <- lm(Y ~ X1 + X2 + X3, df)
anova(fit)

で出てくるF値は、t値の二乗になっていないですよね。
このF値は統計学的にどういう意味のあるF値なんですか。
676名無しさん@そうだ選挙に行こう:2010/07/11(日) 20:31:09
XPSP3でソースコードからshlibをenableにしてRをインストールする方法を知ってる人いませんか?

Rtoolsを利用して通常のtar→makeまではできたのですが、UNIXでの./configure --enable-R-shlib のようなコマンドがわからず困っています…
677名無しさん@そうだ選挙に行こう:2010/07/11(日) 20:39:55
SAS>>SASS>R>えくせろ
678名無しさん@そうだ選挙に行こう:2010/07/11(日) 21:41:45
SPSSだろ
679132人目の素数さん:2010/07/13(火) 10:02:28
>>677
少なくともあなたがコンピュータに無縁なのはよく分かった
680132人目の素数さん:2010/07/14(水) 21:58:23
こんばんは、質問させてください。
factanalを使って1因子の因子分析をしているのですが、初期解を求めようとすると

「以下にエラー solve.default(cv) :
システムは数値的に特異です:条件数の逆数 = 2.13584e-17 」

というエラーが出てしまいます。
prcompを使うと正しく計算されます。
しかし「前回課題で使用したデータ」を「factanalを使って1因子分析」するのが条件なので、
関数やデータをいじるわけにもいきません。
どうしたら解決できるのでしょうか。
681132人目の素数さん:2010/07/14(水) 22:06:13
psppというのもあるよ。
682132人目の素数さん:2010/07/14(水) 22:18:12
>>681
Rに比べると怪しげに見える。
よく知らんけど、Rはgccと同じくらいのレベルで標準を確立したりしていないか?
683132人目の素数さん:2010/07/14(水) 23:13:21
>>680
それってなぜエラーが出るか考えさせる問題ってことはないよね?
684132人目の素数さん:2010/07/15(木) 11:33:10
>>681
まだプロジェクトが続いていたのか。
昔試したときには、GUI化される前のSPSS Baseのコピーって
かんじだったけど。公式ページを見たら、psppもGUI化されたみたいだな。
685132人目の素数さん:2010/07/17(土) 20:20:27
which関数の条件文ってAND条件使えないの?
例えば、
x<-1:10
which(x<5&&x>2)
ってしたら
integer(0)
ってでてくる
686132人目の素数さん:2010/07/17(土) 20:25:44
&は1個でいい
687132人目の素数さん:2010/07/20(火) 10:16:24
>>685
&と&&は意味が違うので注意って入門書に書いていなかった?
688132人目の素数さん:2010/08/01(日) 12:35:35
>>684
>GUI化

結構いい線いってると思うけど、本物と比べると出来ないことが多すぎて
代わりにはなりませんな。
689132人目の素数さん:2010/08/01(日) 13:09:12
batファイルからperlを呼び出して前化工して、
次にRscriptを呼び出して結果を出力して、
後始末して、ということをしてるけど、
batファイルというのがどうも不格好なので、
rファイルだけで全部やらせられない?
690132人目の素数さん:2010/08/04(水) 23:37:19
データフレームの特定の列をfactorにしたい場合って、こう書くしかないのかな?

data$colulmn <- as.factor( data$column );

691132人目の素数さん:2010/08/05(木) 22:22:59
age
692132人目の素数さん:2010/08/11(水) 15:48:15
sage
693132人目の素数さん:2010/08/20(金) 00:47:26
R 2.11.1 を使っています。

group value
a 10
a 12
a 14
a 17
b 23
b 23
b 26
e 1
e 4
e 9
e 9

こんなテーブルを read.csv で読み込んだとき、group の a, b, e という
ベクトルを取得するにはどうすれば良いでしょうか。
694693:2010/08/20(金) 05:47:15
unique 関数でできました。
695132人目の素数さん:2010/08/20(金) 10:02:24
>>694
5時間も悩んだのか、ごくろうさま。
想像する趣旨からすると、levels()を知りたかったのだろうけど。
696132人目の素数さん:2010/08/27(金) 16:14:40
x <- sample(c(0,1),1000,rep=TRUE)

のように、0と1がランダムに入ったベクトルxがあるとして
このxに0がいくつ「連続して」現れるかカウントする
簡単な方法はありますか?

最大の連続数だけでも構いません。
697696:2010/08/27(金) 16:29:02
ちょっとひねくれた方法を思いつきました。

x <- sample(c(0,1),1000,rep=TRUE)
xstr <- paste(x,collapse="")
res <- drop(sapply(strsplit(xstr,"1"), nchar))
print(res)

もっと素直なやり方があってもよさそうですが…。
698132人目の素数さん:2010/08/28(土) 14:37:30
>>696

unlist(lapply(unlist(strsplit(paste(x,collapse=""),"1+")),nchar))

# 最大値のみ
max(unlist(lapply(unlist(strsplit(paste(x,collapse=""),"1+")),nchar)))
699132人目の素数さん:2010/08/28(土) 19:40:34
>>698
なるほど〜。strsplitは正規表現使えたんですね。
それだと空文字列が入らないので>>697よりよさそうです。

正規表現を真っ向から使うならこれもアリですね。
attr(gregexpr("0+",paste(x,collapse=""))[[1]],"match.length")


あれからfilterとかでもやろうとしましたが断念しました。
けっこうありがちなシチュエーションだからRの標準機能で
素直に処理ができそうな気がしたんですが。
700698:2010/08/29(日) 00:59:01
>>699
attr(..., "match.length") いいですね。勉強になります。

標準機能になくても、自力でなんとかなればいいんじゃないでしょうか? (Rの世界では)


せっかくなので、関数化してみました
count_elm <- function (x) {
string <- paste(x, collapse="")
elm <- as.character(sort(unique(x)))
tmp <- as.list(NULL)
for (i in elm) {
tmp <- c(tmp, list(attr(gregexpr(paste(i, "+", collapse="", sep=""), string)[[1]], "match.length")))
}
names(tmp) <- elm
return(tmp)
}


# test
x <- sample(0:4, 1000, replace=T)
y <- count_elm(x)
sum(unlist(y)) # >> 1000、確認OK
y$`0` # 0の連続回数
y[[1]] # 同上
unlist(lapply(count_elm(x), max)) #各要素の最大値
701132人目の素数さん:2010/09/01(水) 09:31:45
Rのコンソールに大量のデータや出力結果が表示されるのを、
一画面毎に停止させるような(読んだら何かのキー入力で次の一画面表示)
コマンドってありますか?
702ほげ:2010/09/04(土) 16:48:13
{
print("hoge")
2 * 3
}
[1] "hoge"
[1] 6
となるが,ブロックの返り値は最後の表現式ではないのだろうか?
何故,print("hoge")まで,このブロックの返り値になるのだろうか?
703132人目の素数さん:2010/09/05(日) 08:22:21
ブロックと関数の区別がついていないとか
704132人目の素数さん:2010/09/05(日) 17:46:47
そもそも返値を理解してない。
[1] "hoge" はprint("hoge")の返値じゃないし。
705132人目の素数さん
>>704
> fuga <- print("hoge")
[1] "hoge"
> fuga
[1] "hoge"
であることを考えると、[1] "hoge"は戻り値でもあるので、
コンソールに出力される[1] "hoge"と戻り値の[1] "hoge"
を区別して説明しないと、聞いてる方は混乱するね。