656 :
635:2010/06/03(木) 17:17:10
いろいろ勉強になります。
少し疑問があるのですが、
リストとデータフレームの違いがイマイチ良く理解できていません。
データフレームはいわゆるエクセルなどのスプレッドシート上のデータ群と
理解しています。
リストはデータフレームよりもフレキシブルなんでしょうか?
リストからデータフレームに変換するのには次の方法で良いのでしょうか?
>x <- list(4:6,7:9,10:12)
>x <-data.frame(x)
宜しくお願い致します。
>>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
どっちもデータフレームだよ。
658 :
635:2010/06/03(木) 18:58:57
>>657 オンラインのものは、- 統計解析ソフトR の備忘録PDF -とか、Rjpwikiとかは一通り読みました。
まだちゃんとは読んでいませんが、英語のR本も何冊か持っています。
今のところの体感認識では、
データフレームは、Rデータエディタで表示すると、きれいにスプレッドシートとして表示される。
リストは、そうでない。
また、リストはリストそのものも要素に扱えるということから、
雑多なデータを寄せ集めて表現しているものという認識で間違っていないでしょうか?
つまり、
データフレーム形式では、行・列の2次元でデータに意味付けされている。
リストでは、そういう縛りがない。
いろいろ丁寧に教えていただき勉強になっています。
ありがとうございます。
659 :
635:2010/06/03(木) 19:18:16
今Rで試してみましたが、
リストはデータフレームそのものも要素になりうるんですね。
リストにデータフレームを1から5まで読み込んで、ひとつのデータフレームにまとめたいときに
>newdataframe<-as.data.frame(original_list)
>newdataframe<-merge(original_list[[1:5]])
上記二つの方法が出来ることがわかりました。
二番目の方法では、列データがまるまる重複するデータは自動的に削除されるので
二番目の方法の方が扱いやすいのかと理解しています。
他の方法などあれば、また教えて下さい。
660 :
635:2010/06/04(金) 12:34:01
自己レスです。
merge()関数は二つのデータフレームしか結合できないようなので、
>newdataframe<-original_list[[1]]
>for(i in 2:5){newdataframe <- merge(newdataframe, original_list[[i]])}
が正しいようでした。
Rでのgrepの使い方がいまいちわからん
662 :
132人目の素数さん:2010/06/11(金) 03:23:47
age
すみません。助けてください。
下記コマンドでエクセルからデータを取り込みました。
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("",""))を使うことは分かったのですが、
因子を文字列に直す方法が分かりません。
宜しくお願い致します。
665 :
132人目の素数さん:2010/06/15(火) 00:07:36
R+freeBSD環境でインストールしているのですが、
2時間掛かっているのに終わりません。
こんなに時間が掛かるものなのでしょうか?
>>665 そんなのマシンによるだろ。
依存ライブラリのコンパイルもしているだろうから、
依存ライブラリが予め入っていないなら+αの時間がかかるし
667 :
132人目の素数さん: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をやらないようにしたい
のですが、やり方がわかりません。出力先をパイプにすればいいのでしょうか?
どうかよろしくお願いします。
668 :
132人目の素数さん:2010/06/16(水) 02:55:12
> sshOut<-pipe('ssh
[email protected] \"command line\" &> /tmp/sshOut', open='w');
とかやると出来そうな雰囲気もあるのですが、パイプに出力をうまくかけません。
流れを読まずに質問
rownameが付いたデータがあります。
as.vectorでもas.listでもfalseになるので型がよく判りませんが、
数値の入った一次元配列?です。
データが1以下の行は使わないので、0とかNAにしましたが、
そのあとの計算で邪魔になってします。
データが1以下の行を削除するには、どうしたらいいのでしょうか?
調べても判らなかったので、ここを見ろ、でも有り難いです。
よくわからないけど
> a <- (1:4)/2
> a
[1] 0.5 1.0 1.5 2.0
> a[a>1]
[1] 1.5 2.0
こういうこと?
671 :
669:2010/06/17(木) 21:34:05
672 :
132人目の素数さん:2010/06/23(水) 14:34:40
質問です。ご回答お願いします。
10行2列のマトリックスAと20行2列のマトリックスBを使って
回帰分析を行いたいんですが、エラーが出ます。
具体的には、A,Bの一列目を従属変数(濃度)、二列目を独立変数(スペクトル)にしてます。
関数lmを使ってAで作った検量線に、関数predictを使ってBの二列目を代入したい
(スペクトルの値から濃度を予測したい)と考えているのですが、
「データ数が違う」という旨の警告が出てできません。
分かりにくいかもしれませんが、宜しくお願いします。
>>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
ってこと?具体的なコード(再現性のあるサンプルコード)を示してくれないと、
なんで出来ないのかこちらには分からない。
674 :
132人目の素数さん:2010/07/04(日) 01:35:42
nnet使ってるけど、これって出力層のユニット数は変更できないの?
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 のようなコマンドがわからず困っています…
SAS>>SASS>R>えくせろ
SPSSだろ
>>677 少なくともあなたがコンピュータに無縁なのはよく分かった
こんばんは、質問させてください。
factanalを使って1因子の因子分析をしているのですが、初期解を求めようとすると
「以下にエラー solve.default(cv) :
システムは数値的に特異です:条件数の逆数 = 2.13584e-17 」
というエラーが出てしまいます。
prcompを使うと正しく計算されます。
しかし「前回課題で使用したデータ」を「factanalを使って1因子分析」するのが条件なので、
関数やデータをいじるわけにもいきません。
どうしたら解決できるのでしょうか。
psppというのもあるよ。
>>681 Rに比べると怪しげに見える。
よく知らんけど、Rはgccと同じくらいのレベルで標準を確立したりしていないか?
>>680 それってなぜエラーが出るか考えさせる問題ってことはないよね?
>>681 まだプロジェクトが続いていたのか。
昔試したときには、GUI化される前のSPSS Baseのコピーって
かんじだったけど。公式ページを見たら、psppもGUI化されたみたいだな。
685 :
132人目の素数さん:2010/07/17(土) 20:20:27
which関数の条件文ってAND条件使えないの?
例えば、
x<-1:10
which(x<5&&x>2)
ってしたら
integer(0)
ってでてくる
&は1個でいい
>>685 &と&&は意味が違うので注意って入門書に書いていなかった?
>>684 >GUI化
結構いい線いってると思うけど、本物と比べると出来ないことが多すぎて
代わりにはなりませんな。
batファイルからperlを呼び出して前化工して、
次にRscriptを呼び出して結果を出力して、
後始末して、ということをしてるけど、
batファイルというのがどうも不格好なので、
rファイルだけで全部やらせられない?
データフレームの特定の列をfactorにしたい場合って、こう書くしかないのかな?
data$colulmn <- as.factor( data$column );
691 :
132人目の素数さん:2010/08/05(木) 22:22:59
age
sage
693 :
132人目の素数さん: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 という
ベクトルを取得するにはどうすれば良いでしょうか。
694 :
693:2010/08/20(金) 05:47:15
unique 関数でできました。
>>694 5時間も悩んだのか、ごくろうさま。
想像する趣旨からすると、levels()を知りたかったのだろうけど。
696 :
132人目の素数さん:2010/08/27(金) 16:14:40
x <- sample(c(0,1),1000,rep=TRUE)
のように、0と1がランダムに入ったベクトルxがあるとして
このxに0がいくつ「連続して」現れるかカウントする
簡単な方法はありますか?
最大の連続数だけでも構いません。
697 :
696: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)
もっと素直なやり方があってもよさそうですが…。
>>696 unlist(lapply(unlist(strsplit(paste(x,collapse=""),"1+")),nchar))
# 最大値のみ
max(unlist(lapply(unlist(strsplit(paste(x,collapse=""),"1+")),nchar)))
>>698 なるほど〜。strsplitは正規表現使えたんですね。
それだと空文字列が入らないので
>>697よりよさそうです。
正規表現を真っ向から使うならこれもアリですね。
attr(gregexpr("0+",paste(x,collapse=""))[[1]],"match.length")
あれからfilterとかでもやろうとしましたが断念しました。
けっこうありがちなシチュエーションだからRの標準機能で
素直に処理ができそうな気がしたんですが。
700 :
698: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)) #各要素の最大値
Rのコンソールに大量のデータや出力結果が表示されるのを、
一画面毎に停止させるような(読んだら何かのキー入力で次の一画面表示)
コマンドってありますか?
702 :
ほげ:2010/09/04(土) 16:48:13
{
print("hoge")
2 * 3
}
[1] "hoge"
[1] 6
となるが,ブロックの返り値は最後の表現式ではないのだろうか?
何故,print("hoge")まで,このブロックの返り値になるのだろうか?
ブロックと関数の区別がついていないとか
そもそも返値を理解してない。
[1] "hoge" はprint("hoge")の返値じゃないし。
>>704 > fuga <- print("hoge")
[1] "hoge"
> fuga
[1] "hoge"
であることを考えると、[1] "hoge"は戻り値でもあるので、
コンソールに出力される[1] "hoge"と戻り値の[1] "hoge"
を区別して説明しないと、聞いてる方は混乱するね。