X



トップページ数学
1002コメント395KB
【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001132人目の素数さん垢版2017/08/03(木) 19:23:12.67ID:Hq1blL0O
R は統計計算とグラフィックスのための言語・環境です。
統計計算で重宝するデータ型や、複数要素を処理する演算や関数、
解析結果を表示するグラフィックなど、多彩な機能を提供します。

●関連サイト
The R Project
http://www.r-project.org/
RjpWiki
http://www.okada.jp.org/RWiki/
リンク集
http://www.okada.jp.org/RWiki/?%A5%EA%A5%F3%A5%AF%BD%B8
※前スレ
【R言語】統計解析フリーソフトR 第5章【GNU R】
http://rio2016.2ch.net/test/read.cgi/math/1380168442/
0424413垢版2018/06/11(月) 21:00:49.78ID:K1zGYlRd
>>414-422
みなさまご返信ありがとうございました。
例示したものがbase::rmだったので自作関数のことまでは想像だにしませんでした…(がとても良い勉強になりました。)

自環境でも上書きした関数を元に戻すことが出来ることを確認しました。
0425132人目の素数さん垢版2018/06/12(火) 07:42:40.88ID:9RfEtlLW
>>421
戻したいのが自作関数
rm = function(x) asin(sqrt(x))
だったら上書きされて無理じゃないの?
ゴミ箱から消去したファイルを復活させるソフトもあるから
PCに詳しければ可能かもしれないけれど
Rの機能としては復活させるのは無理と思う。
0426132人目の素数さん垢版2018/06/12(火) 11:00:45.94ID:cD/mQB+6
自作のrm関数はbaseパッケージとは別に定義されるから
base::rm(rm)で自作の方のrmは消えてbase::rmが「復活」します。
0428132人目の素数さん垢版2018/06/12(火) 14:36:07.63ID:VF7OcVBc
>>425
ちょっと意味がわからない。
自作の関数なら定義を再実行するだけなのに、
消える消えないって何が問題なんだ?
0430132人目の素数さん垢版2018/06/14(木) 09:27:55.98ID:mxBGyFKT
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり

共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/

共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://www.sketchapp.com/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/

Trello Chrome拡張機能プラグイン集
https://chrome.google.com/webstore/search/trello?_category=extensions

Slackプラグイン集
https://slack.com/apps

Sketchプラグイン集
https://sketchapp.com/extensions/plugins/
https://supernova.studio/
0432132人目の素数さん垢版2018/06/17(日) 19:06:33.58ID:OYjqtCQI
>>306
知恵袋に漸化式があったので計算スクリプトを書いてみた。
表がでる確率pのコインをN回投げてK回以上表が続く確率。

# N: flips
# K: least sequential head
# p: probability of head
seqNp <- function(N=100,K=5,p=0.5){
if(N==K) return(p^K)
q=1-p
a=numeric(N) # a(n)=P0(n)/p^n , P0(n)=a(n)*p^n
for(i in 1:K) a[i]=q/p^i # P0(i)=q for any i

for(i in K:(N-1)){ # recursive formula
a[i+1]=0 # a[i+1]=q/p*(a[i]+a[i-1]+a[i-2]+...+a[i-(K-1)])
for(j in 0:(K-1)){
a[i+1]=(a[i+1]+a[i-j])
}
a[i+1]=q/p*a[i+1]
}

P0=numeric(N) # P0[n] : probability of ending with 0 head when flipped n times
for(i in 1:N) P0[i]=a[i]*p^i # P0(n)=a(n)*p^n

MP=matrix(rep(NA,N*K),ncol=K)
colnames(MP)=paste0('P',0:(K-1))
MP[,'P0']=P0
MP[1,'P1']=p
for(i in (K-2):K) MP[1,i]=0
# MP[k,n] = Pk[n] : probability of ending with k head when flipped n times
for(k in 2:K){ # Pk(n+1)=p*P(k-1)(n)
for(i in 1:(N-1)) MP[i+1,k]=p*MP[i,k-1]
}
ret=1-apply(MP,1,sum)

ret[N]
}
0435132人目の素数さん垢版2018/06/19(火) 10:20:04.23ID:fcA67BpN
>>434
run.check <- function (x, n=5) {
# x の中に 1 が n 回以上連続していれば TRUE を返す.

chg <- c(TRUE, diff(x) != 0) # 変化があった場所
chgidx <- c(which(chg), length(x)+1) # 変化があった場所の添え字
run.length <- diff(chgidx) # 0や1の連続している個数
true.length <- run.length[x[chg] == 1] # 1の連続している個数
any(true.length >= n) # 連続している個数が n 以上のrunがあるか?
}
0436132人目の素数さん垢版2018/06/19(火) 21:57:17.85ID:QuKrVrE8
>>435
whichとdiffを用いての解法のお返事ありがとうございます。

実行時間を>302のスクリプトと比べてみました。

run.check <- function (x, n=5) {
# x の中に 1 が n 回以上連続していれば TRUE を返す.

chg <- c(TRUE, diff(x) != 0) # 変化があった場所
chgidx <- c(which(chg), length(x)+1) # 変化があった場所の添え字
run.length <- diff(chgidx) # 0や1の連続している個数
true.length <- run.length[x[chg] == 1] # 1の連続している個数
any(true.length >= n) # 連続している個数が n 以上のrunがあるか?
}


# N(=100)回コインをなげてn(=5回)以上続けて表がでる確率。
seqn<-function(n=5,N=100,p=0.5){
rn=rbinom(N,1,p)
count=0
for(i in 1:N){
if(rn[i] & count<n){
count=count+1
}
else{
if(count==n) {return(TRUE)}
else{
count=0
}
}
}
return(count==n)
}

> system.time(mean(replicate(10^5,run.check(rbinom(100,1,0.5)))))
user system elapsed
17.56 0.04 17.68
> system.time(mean(replicate(10^5,seqn())))
user system elapsed
9.74 0.07 9.78

後者の方が速いのは1がn個連続したら、TRUEを返して終了するので以後のチェックはしないためだろうと思います。

diff や anyの使い方が勉強になりました。

時間を割いてスクリプトを作成していただいてありがとうございます。<(_ _)>
0437132人目の素数さん垢版2018/06/21(木) 10:12:41.96ID:Ze2kEGUX
Rstudioで日本語の入力ができないのですが、解決する方法知ってる方いませんか?
具体的には、IME自体をオンにすることができません。
日本語の表示やコピペは問題なくできます。

環境
Linux - Utubntu
RStudio Version 1.0.143
0438132人目の素数さん垢版2018/06/21(木) 10:26:53.84ID:Fds/4hNR
RStudioのQtが古いのでパッチ当てないと日本語入力できないのが現状ですわ
パッチはUbuntu 16.04.LTS用にしかないので他のバージョンならRStudioサーバー使った方が早いかと

なお、パッチはRStudio 日本語とかでグクってみて
0439132人目の素数さん垢版2018/06/23(土) 17:38:43.39ID:aZCZP6wm
windows版のRStudioでもたまに日本語入力ができなくなる。
別のソフトでIMEのON/OFFをやってから戻ると直るけど。
0441132人目の素数さん垢版2018/06/23(土) 21:30:47.03ID:JcH4CpHc
Windowsはストアアプリでも同じ症状でるから持病なんじゃないかと思う
Ubuntuはfcitxのパッチ当てとけばWindowsのような症状は出ないので快適
0443132人目の素数さん垢版2018/06/26(火) 07:08:45.35ID:Na/Ih9Bj
問題

99人の囚人がいます。彼らの頭に1〜100までのナンバーカードが貼りつけられた帽子をランダムにかぶせます。
他人の帽子は見ることができても、自分の帽子は見ることができません。
帽子の数は全部で100なので、一つ使われずに余ります。
そのナンバーは囚人達にはわからないようにしておきます。
この状況で、囚人たちに一斉に自分のナンバーを宣言させて、全員が正解だったら釈放するという賭けをします。
囚人たちには帽子をかぶせられる前に相談タイムが設けられています。
どういう戦略を取れば、助かる確率を最も高くできるでしょうか?
http://000013.blogspot.com/2010/12/99.html

解答を読んでも数理が理解できないが
確率が0.5になるのはシミュレーションできた。

# http://000013.blogspot.com/2010/12/99.html
inversion <- function(x){
n=length(x)
ret=numeric(n)
for(i in 1:(n-1)){
ret[i] = sum(x[i] > x[(i+1):n])
}
sum(ret) # inversion number
}
is.even= function(x) !inversion(x)%%2 # is inverion number even?

prisoner99 <- function(n=100){
indx=sample(1:n,1) # defective number
X=sample((1:n)[-indx])
Y=numeric(n-1)
for (i in 1:(n-1)){ # select as even permutation
x1=X[-i]
x2=(1:n)[!(1:n) %in% x1] # two numbers unseen for i-th prisoner
tmp=X
tmp[i]=x2[1] ; tmp[n]=x2[2]
Y[i]=ifelse(is.even(tmp), x2[1],x2[2])
}
all(X==Y)
}
mean(replicate(1e3,prisoner99()))
0444132人目の素数さん垢版2018/07/11(水) 16:20:29.88ID:zFHa28EV
>>437
遅レスだが、Ubuntu 18.04LTSならデフォルトのIBus-mozcで日本語入力ができるそうだ。
詳しくはUbuntu Weekly Recipeの第527回を読んでくだされ
0445132人目の素数さん垢版2018/07/22(日) 11:22:38.35ID:Ott8rTSz
覆面算 RED + WHITE = COLOR

どうもCでやったらうまくいかないのでRでやってみた。

# RED + WHITE = COLOR
x=c('R','E','D','W','H','I','T','E','C','O','L','O','R')
unique(x)
redwhite <- function(R,E,D,W,H,I,T,C,O,L){
red=10^(2:0)
white=10^(4:0)
color=10^(4:0)
sum(red*c(R,E,D))+sum(white*c(W,H,I,T,E)) - sum(color*c(C,O,L,O,R))
}

x=unique(x) ; x
REDWHITECOLOR <- function(x){
R=x[1]
E=x[2]
D=x[3]
W=x[4]
H=x[5]
I=x[6]
T=x[7]
C=x[8]
O=x[9]
L=x[10]

cat(paste('RED = ',R,E,D,
' WHITE = ',W,H,I,T,E,
' COLOR = ',C,O,L,O,R),'\n')
}
REDWHITECOLOR(unique(x))

library(gtools)
perm=permutations(n=10,r=10,v=0:9)
perm=perm[perm[,1]!=0&perm[,4]!=0&perm[,8]!=0,] # R!=0,W!=0,C!=0
head(perm) ; tail(perm)
n=nrow(perm)
re=numeric(n)
for(i in 1:n){
re[i]=redwhite(perm[i,1],perm[i,2],perm[i,3],perm[i,4],perm[i,5],perm[i,6],perm[i,7],perm[i,8],perm[i,9],perm[i,10])
}
hist(re)
(indx=which(re==0))
REDWHITECOLOR(perm[indx,])

> REDWHITECOLOR(perm[indx,])
RED = 5 8 7 WHITE = 3 9 6 1 8 COLOR = 4 0 2 0 5
0446132人目の素数さん垢版2018/07/22(日) 12:50:02.38ID:Ott8rTSz
# AAB
# × CD
# ------
# CCE
# BFAA
# ------
# BEBDE
f <- function(A,B,C,D,E,F){
(A*100+A*10+B)*D==C*100+C*10+E &(A*100+A*10+B)*C==B*1000+F*100+A*10+A &
(C*100+C*10+E)+(B*1000+F*100+A*10+A)*10==B*10000+E*1000+B*100+D*10+E
}
library(gtools)
perm=permutations(n=10,r=6,v=0:9)
n=nrow(perm)
re=numeric(n)
for(i in 1:n){
re[i]=f(perm[i,1],perm[i,2],perm[i,3],perm[i,4],perm[i,5],perm[i,6])
}
indx=which(re==TRUE)
perm[indx,]
0447132人目の素数さん垢版2018/07/23(月) 11:09:01.32ID:SDW/E7TY
大変初歩的な質問で恐縮ですが、ご教示いただければ幸いです。

PERT分布を学んでいるのですが、ベータ分布のスケーリングの仕方が分かりません。
最小値a、最頻値b、最大値c として、a, b, c から求めたパラメータをa1、a2 とします。
このとき、
dbeta(x, a1, a2)*(c-a)+a
とすると、当然ながら横軸の値の範囲は0から1で、縦軸の値のみ大きくなってしまいます。

横軸の値の範囲がaからcで、縦軸の値は確率密度のままにするには、どうしたらよいのでしょうか?
0449132人目の素数さん垢版2018/07/23(月) 18:17:20.65ID:SDW/E7TY
>>448

447です。ご教示どうもありがとうございました。

a <- 40 # 最小値
b <- 45 # 最頻値
c <- 70 # 最大値
mu <- (a+4*b+c)/6 # PERT分布の平均値
a1 <- b*(mu-a)/(c-a) # パラメータ a1
a2 <- b*(c-mu)/(c-a) # パラメータ a2
pert1 <- function(x) dbeta(x,a1,a2) # ベータ分布布の計算


まではできたのですが、ご教示いただいた方法で
pert1 <- function(x) dbeta(x-a ,a1,a2)
とすると、x の範囲が0から1で、yが0の一様分布のようなグラフになってしまいます。
0450132人目の素数さん垢版2018/07/23(月) 20:05:23.59ID:5MGL8f5L
4パラべーたへの変換は下記かな?
https://en.wikipedia.org/wiki/Beta_distribution#Four_parameters_2
a1とa2のパラメータ推定って合ってるんだっけ?僕も正直わかんない

やりたいことはこれだと思う
install.packages("mc2d")してからやってね
----------------------------------------------------
rm(list=ls())
library(mc2d)

a <- 40 # 最小値
b <- 45 # 最頻値
c <- 70 # 最大値

pert4<-function(x) dpert(x,min=a,mode=b,max=c,shape=4)
x1<-40:70
plot(x1,pert4(x1))
0451132人目の素数さん垢版2018/07/23(月) 21:05:56.52ID:+HoGXx9d
>>450
447です。

450様、まさにこれ、これです。どうもありがとうございました。
おかげさまで大変助かりました。

448様にも、ご助言下さいましたこt、厚く御礼申し上げます。
0452132人目の素数さん垢版2018/07/27(金) 15:50:12.19ID:E7dz8jqT
lmtestのパッケージをインストールしようとすると不正なマルチバイト文字がありますと出てくるのですがどうすればいいですか?
0453132人目の素数さん垢版2018/07/27(金) 17:33:01.36ID:ufA3ZDTu
>>452
Windows 10 (Rの日本語ヘルプはインストールしていない)+ R studioだけど、そのメッセージ出ないな。
0455132人目の素数さん垢版2018/07/28(土) 12:56:05.38ID:lhV9Awbf
職場のSPSS信者たちにRを認めてもらうにはどうしたら良いだろう
「安かろう悪かろう」「俺が知らないものは三流」的な考え方の人が多くて肩身が狭い…
0456132人目の素数さん垢版2018/07/28(土) 17:53:14.05ID:XHIBT/Gx
>>455
>>452のようなエラーが出たら「無料のものはやっぱりダメね」
有償(SPSS) →信頼できる
ボランティア→いい加減
と言う思考らしい
0457132人目の素数さん垢版2018/07/28(土) 18:33:45.13ID:l8Bhwsl9
>>454
ユーザー名はアルファベット1文字です
studioインストールしてないんですけど、しないとダメですか?
0459132人目の素数さん垢版2018/07/29(日) 07:46:06.57ID:u2P99O/7
linuxなら環境変数LANGをCにすれば解決する問題だからwindowsでも似たような対処すれば行けそう。
0460132人目の素数さん垢版2018/07/29(日) 19:38:42.16ID:hjP1s1BE
これかな?

> Sys.setlocale(locale="C") # locale の変更(USの設定にしないと表示が変になる)
[1] "C"
元に戻すには
> Sys.setlocale(locale="Japanese_Japan.932")
0461132人目の素数さん垢版2018/08/02(木) 20:59:18.66ID:DvtHDake
すみません、教えて下さい。

フィッシャーの正確確率検定で、
適合度(一様性)の検定ってできますか?
できるのは独立性の検定のみ?

Rでいろいろ試したみたんですが、
2群ないとエラーになる。。
0463132人目の素数さん垢版2018/08/02(木) 21:52:11.65ID:DvtHDake
>>462
レス感謝です。

そうなんですが、
期待度数が5未満になってしまった場合は、
カイ二乗検定は向かないんですよね?
0465132人目の素数さん垢版2018/08/02(木) 23:02:57.38ID:clch7kxN
>>463
こういうので
r1=5;r2=4;n1=10;n2=12
prop.test(c(r1,r2),c(n1,n2),correct=TRUE)
chisq.test(matrix(c(r1,r2,n1-r1,n2-r2),2,byrow=TRUE),correct=TRUE)

警告がでるという話かな?
Warning message:
In chisq.test(matrix(c(r1, r2, n1 - r1, n2 - r2), 2, byrow = TRUE), :
Chi-squared approximation may be incorrect
0466132人目の素数さん垢版2018/08/03(金) 09:04:31.58ID:VGe+pklE
>>463
適合度を見るのに関係ないだろ。
> cnt
[1] 1 0 2 4 3 4 12 6 12 11 21 22 21 37 40 30 59 44 49 47 38 48 36 43 38
[26] 46 33 34 30 21 26 33 17 13 14 12 8 16 7 7 9 6 6 5 3 8 4 4 4 1
[51] 0 2 1 0 0 0 0 2
> prb
[1] 0.0002947255 0.0006464052 0.0012538873 0.0022037831 0.0035720843
[6] 0.0054114364 0.0077413658 0.0105430123 0.0137588816 0.0172972083
[11] 0.0210398698 0.0248524558 0.0285950600 0.0321325300 0.0353432214
[16] 0.0381256526 0.0404028045 0.0421240952 0.0432652773 0.0438266419
[21] 0.0438299769 0.0433147339 0.0423338191 0.0409493611 0.0392287274
[26] 0.0372409836 0.0350539129 0.0327316483 0.0303329196 0.0279098757
[31] 0.0255074215 0.0231629878 0.0209066521 0.0187615256 0.0167443293
[36] 0.0148660914 0.0131329065 0.0115467110 0.0101060386 0.0088067297
[41] 0.0076425765 0.0066058952 0.0056880193 0.0048797146 0.0041715201
[46] 0.0035540195 0.0030180499 0.0025548579 0.0021562071 0.0018144483
[51] 0.0015225575 0.0012741483 0.0010634658 0.0008853653 0.0007352804
[56] 0.0006091856 0.0005035529 0.0004153084
> chisq.test(cnt, p=prb, rescale.p=TRUE, simulate.p.value=TRUE)

Chi-squared test for given probabilities with simulated p-value (based
on 2000 replicates)

data: cnt
X-squared = 65.504, df = NA, p-value = 0.2189
5未満の数があっても関係がない
0468132人目の素数さん垢版2018/08/04(土) 02:59:15.87ID:8dNre62F
463です。
カイ二乗検定で、期待度が5未満が多いのは不適切なのかと思い込んでおりましたが、
それは独立性の検定の場合のことであり、
適合度(一様性)の検定の場合は、
気にしなくて良かったのか。。
ならカイ二乗検定でやります。

いろいろ教えて下さり、ありがとうございます。
0474132人目の素数さん垢版2018/08/05(日) 19:10:34.43ID:mULz5b3r
>>472
周囲のspssユーザを見ると「指導教員がspssしか使えないので、
自分もspssしか使えない、
新しい(学術系)ソフトは誰かに丁寧に根気よく指導してみらえないと無理」、
これの再生産。
0479132人目の素数さん垢版2018/08/08(水) 13:11:20.17ID:7/3l/PxD
再帰呼び出しに関数名の代わりにRecall使うと処理に要する時間が増えることに気づいた。

フィボナッチ数列の再帰呼び出し
# 関数名での呼び出し
fibo <- function(n){
if(n==1|n==2) return(1)
else fibo(n-1)+fibo(n-2)
}

# Recallを使っての呼び出し
fiboR <- function(n){
if(n==1|n==2) return(1)
else Recall(n-1)+Recall(n-2)
}


> system.time(fibo(30))
user system elapsed
4.27 0.02 4.36
> system.time(fiboR(30))
user system elapsed
6.65 0.00 6.70
0480132人目の素数さん垢版2018/08/09(木) 17:47:22.65ID:l1M8GWWv
cumsumを再帰関数で書いてみた。

何度も試行錯誤

# cumsum with recursive call
cumsumR <- function(v){
res=numeric(length(v))
cumsumR_sub <- function(v,res,i){
res[1]=v[1]
if(i==length(v)) return(res)
else{
res[i+1] = res[i] + v[i+1]
Recall(v,res,i+1)
}
}
cumsumR_sub(v,res,1)
}
cumsumR(1:10)

とりえあず、動作した。
> cumsumR(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
0481132人目の素数さん垢版2018/08/09(木) 18:31:24.68ID:l1M8GWWv
簡略化できた

cumsumR <- function(v,res=NULL,i=1){
res[1]=v[1]
if(i==length(v)) return(res)
else{
res[i+1] = res[i] + v[i+1]
Recall(v,res,i+1)
}
}

> cumsumR(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
>
0482132人目の素数さん垢版2018/08/10(金) 18:41:42.48ID:Hlm8Oe3x
ifelseの動作がどうも納得できないでご教示いただきたいのですが。
これってifelseの仕様でしょうか?バグでしょうか?

> x=2:1
> if(x[1]<=x[2]) x else x[2:1]
[1] 1 2
> ifelse(x[1]<=x[2],x,x[2:1])
[1] 1
0483132人目の素数さん垢版2018/08/10(金) 18:55:39.89ID:vdkgfABT
>>482
ifelse() はベクトル演算できる関数。
だから、戻り値の要素数は、test部分の要素数に一致する。
testが1つなので、x[2:1]の1つ目の要素が返される。
0484483垢版2018/08/10(金) 18:58:51.59ID:vdkgfABT
testの要素を2つにすれば、出力も2つになる。
> ifelse(c(x[1] <= x[2], x[1] <= x[2]), x, x[2:1])
[1] 1 2
さらに3つにすると、helpに書いている通り、yesやno部分は再利用される。
> ifelse(c(x[1] <= x[2], x[1] <= x[2], x[1] <= x[2]), x, x[2:1])
[1] 1 2 1
0485132人目の素数さん垢版2018/08/10(金) 23:06:17.77ID:Hlm8Oe3x
>>483
ありがとうございました。

バグではなくてそういう仕様だったのですね。

こういう使い方ができるということがわかって勉強になりました。

> x=2:1
> ifelse(c(x[1]!=x[2],x[1]==x[2]),1:2,3:4)
[1] 1 4
0486132人目の素数さん垢版2018/08/10(金) 23:17:14.10ID:VlOUWHrC
教わったので早速、

ifelse() はベクトル演算できると、再利用されるの動作確認。

> ifelse(c(TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE),1:2,11:15)
[1] 1 2 13 14 1 11 12
0487132人目の素数さん垢版2018/08/10(金) 23:45:24.37ID:VlOUWHrC
2種類の文字の変換もifelseでできるんだなぁ。
> mat
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 0
[3,] 1 1 0
[4,] 1 1 0
[5,] 1 1 0
[6,] 1 1 0
> print(apply(mat,2, function(x) ifelse(x==1,'真','偽')),quote=F)
[,1] [,2] [,3]
[1,] 真 真 真
[2,] 真 真 偽
[3,] 真 真 偽
[4,] 真 真 偽
[5,] 真 真 偽
[6,] 真 真 偽
0488132人目の素数さん垢版2018/08/11(土) 00:28:09.90ID:OesSEWnz
行列も次元付きのベクトルだからもっと簡略化できた。

> (mat=matrix(sample(0:1,12,rep=T),3,4))
[,1] [,2] [,3] [,4]
[1,] 1 1 0 1
[2,] 0 1 0 0
[3,] 1 0 0 1
> print(ifelse(mat==1,'Right','Wrong'),quote=F)
[,1] [,2] [,3] [,4]
[1,] Right Right Wrong Right
[2,] Wrong Right Wrong Wrong
[3,] Right Wrong Wrong Right
>
0490132人目の素数さん垢版2018/08/22(水) 14:02:15.21ID:rznk0lAS
規約分数にするパッケージが探せなかったので自分でスクリプトを組んでみた。
エラー処置は省略。


reduce_fraction <- function(x,y){
a=x
b=y
r = a%%b # a=bq+r -> a%%b=b%%r
while(r){
a = b
b = r
r = a%%b
}
gcd=b
cat(x/gcd,'/',y/gcd,'\n')
invisible(c(x/gcd,y/gcd))
}


> reduce_fraction(2860,1082900)
11 / 4165
0491132人目の素数さん垢版2018/08/23(木) 01:12:39.77ID:0Wz4IoKN
rvest?でログイン必要なとこをスクレイピングする時って
login_page <- html_session("https://xxxxx";)

login_form <- html_form(login_page)[[1]] %>%
set_values(AAA="xxxx", BBB="xxxx")

というので行けるはずなんですが
最終行のAAAとBBBってそれぞれhtmlタグのname=""のとこからとってくるんですよね?
これにここがname="user[email]"みたいに[]という記号はいってたらどうすればいいでしょうか?
0492132人目の素数さん垢版2018/08/25(土) 17:48:59.21ID:MdsDkupV
>>491
よろしくおねがいいしまーーーーーーーす
0493132人目の素数さん垢版2018/08/26(日) 22:01:57.06ID:2bj/HrEX
>>492
質問の意味がいまいち分からないから、誰も助言できないのでは?

> x <- 'user[email]'
> x
[1] "user[email]"

rvestパッケージを使ったことがないけど、
記号が入っていたらなぜ問題があるのかよく分からない。
0495132人目の素数さん垢版2018/08/27(月) 06:16:23.20ID:x8E4FG0O
>>493
ちがいます
AAAがどれかよくみてみてください
””はありません
0496132人目の素数さん垢版2018/08/27(月) 06:19:43.00ID:x8E4FG0O
ちょっと直接はることはできないのでタグだけはります。
<input class="form-control" autofocus="autofocus" placeholder="Email address" required="required" type="text" value="" name="user[email]" id="user_email">>>494
0497132人目の素数さん垢版2018/08/27(月) 13:25:39.67ID:SdOxff6m
>>495
もっと分かるように説明しないと、追試できる情報も提供しないし。
もしかして変数名などに[]が入っている場合 にどうしたらよいかってこと?

> `user[email]` <- 1:5
> `user[email]`
[1] 1 2 3 4 5
0498132人目の素数さん垢版2018/08/27(月) 15:43:37.46ID:x8E4FG0O
>>497
多分行けました
超感謝!!
0499132人目の素数さん垢版2018/08/27(月) 20:20:32.13ID:5a+trmgU
ある問題のシミュレーションしようと思って
問題文の記号のまま

q <- function(x)
....

とやって
q(100)と入力すると
Rが終了することに気づいた。
0501132人目の素数さん垢版2018/08/29(水) 22:45:10.53ID:BcwFyR33
ちょっとした疑問です。

空ベクトルの検出って長さ0以外に検出方法ってあるでしょうか?

> x=c(1,2)
> x=x[-1]
> x=x[-1]
> length (x)
[1] 0
> x
numeric(0)
> x==numeric (0)
logical(0)
> is.null(x)
[1] FALSE
> is.na(x)
logical(0)
> x==NULL
logical(0)
> x==NA
logical(0)
> length(x)==0
[1] TRUE
0502132人目の素数さん垢版2018/08/31(金) 22:46:15.16ID:IWQvY6FL
4点の座標を入力するとそれらを結ぶ四面体の体積を求めるスクリプトを書いてみた。
高さはパッケージnleqslvを使った近似計算。

# Calculate tetrahedron volume from cordinates
library(nleqslv)
Tetra <- function(O=c(1/2,sqrt(3)/6,sqrt(2/3)),A=c(0,0,0),B=c(1,0,0),C=c(cos(pi/3),sin(pi/3),0)){
fn <- function(x,O,A,B,C){
AO=A-O
BO=B-O
CO=C-O
HO=x[1]*AO+x[2]*BO+(1-x[1]-x[2])*CO # H on triangle ABC
AB=B-A
AC=C-A
c(HO%*%AB,HO%*%AC) # HO vertial to AB and AC
}
fn1 <- function(x) fn(x,O,A,B,C)
x=nleqslv::nleqslv(c(1/3,1/3),fn1)$'x'
AO=A-O
BO=B-O
CO=C-O
HO=x[1]*AO+x[2]*BO+(1-x[1]-x[2])*CO
h=sqrt(sum(HO^2))
a=sqrt(sum((B-C)^2))
b=sqrt(sum((C-A)^2))
c=sqrt(sum((A-B)^2))
s=(a+b+c)/2
base=sqrt(s*(s-a)*(s-b)*(s-c))
V=1/3*base*h
return(V)
}

初期値は辺の長さ1の正四面体

> options(digits = 16)
> Tetra()
[1] 0.1178511301977579
> sqrt(2)/12
[1] 0.1178511301977579

多分、正常に動作していると思う。
0503132人目の素数さん垢版2018/09/01(土) 00:25:33.05ID:52Ub52jp
>>502
行列式det使うと簡単
> po <- c(1/2, sqrt(3)/6, sqrt(2/3))
> pa <- c(0,0,0)
> pb <- c(1,0,0)
> pc <- c(cos(pi/3), sin(pi/3), 0)
> det(cbind(pa-po,pb-po,pc-po))/6
[1] -0.1178511
0504132人目の素数さん垢版2018/09/01(土) 01:41:47.56ID:qG52f2Ee
ベクトルの三重積を教わったので、パッケージ pracma の外積crossを使った

tetrahedron <- function(O=c(1/2,sqrt(3)/6,sqrt(2/3)),A=c(0,0,0),B=c(1,0,0),C=c(cos(pi/3),sin(pi/3),0)){
AO=A-O
BO=B-O
CO=C-O
as.numeric(abs(pracma::cross(AO,BO) %*% CO)/6)
}

4行で済んだ。

>>503

ありがとうございました。

パッケージに頼らずに計算できたのですね。
0505132人目の素数さん垢版2018/09/03(月) 18:55:17.77ID:S47YTHgP
データを解析する前にさらっと特徴を見たい時、皆さんはどんなコマンドを使っていますか?

私が思いつくのは
summary
boxplot
hist
pairs

です。こんなのも良いよってのがあったら教えてくださいm(_ _)m

※ライブラリの使用有無は問いません
0509132人目の素数さん垢版2018/09/09(日) 22:35:22.23ID:9XY+z1xx
>>501
良い方法が見つからなかったので !length(x)で空白ベクトル判定とした。

文字列を逆に並べる再帰呼び出しスクリプト

> reverse <- function(x){
+ if(!length(x)) return(NULL)
+ c(Recall(x[-1]),x[1])
+ }
> cat(reverse(LETTERS[1:26]))
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
0512132人目の素数さん垢版2018/09/10(月) 18:22:05.74ID:gLTPxqtw
>>511
length は数値を返す関数なのに、なぜわざわざ論理演算をするんだ?
プログラムは、ここの議論を知らない人が読む可能性のほうが高いんだぞ。
0513132人目の素数さん垢版2018/09/10(月) 19:12:52.95ID:ZYY4OYkH
>>512
正規分布が一様分布より大きい期待値の算出に
mean(rnorm(100)>runif(100))
って書かない?
俺は
sum(ifelse(rnorm(100)>runif(100),1,0))/100
って書いたりしないけど。
0515132人目の素数さん垢版2018/09/10(月) 19:50:35.36ID:ZYY4OYkH
>>514
論理値を数値に置き換えて計算しているから
数値を論理値にしても別に違和感がない。
可読性は慣れの問題。
0517132人目の素数さん垢版2018/09/10(月) 21:30:23.37ID:gLTPxqtw
>>513
それとこれとは話が別だ。
logical は TRUE か FALSE の二値しかとらないから、それから数値への変換は自明。
多種の値をとる数値に論理演算をするのはいただけない。
0518132人目の素数さん垢版2018/09/10(月) 21:36:20.92ID:gLTPxqtw
>>515
is.empty.vector のような関数があるならそれでよいが、length を使っているのだから、それを勝手にベクトルが空かどうかの判断に使っているのはあなたであって、他人はそのようには考えない、といっているのだ。
自分だけしかこーどを見ないならべつに構わないが、こういうところに晒すのはよくない。
ましてや常套手段などと言って他人に教え込むのはやめてもらいたい。
0520132人目の素数さん垢版2018/09/10(月) 21:55:50.32ID:5QS5/GHY
whileの中は1でも2でもよくね?

n=0
while(1){
if(n>10) return(10)
n=n+1
}


n=0
while(2){
if(n>10) return(10)
n=n+1
}
0521132人目の素数さん垢版2018/09/10(月) 22:00:57.10ID:5QS5/GHY
>509は
配列を逆順に並べる再帰呼出しのコード。

Rにはrevという関数がある。

そのコードみてみ!

lengthを真偽判定に使ってますがな。


> base:::rev.default
function (x)
if (length(x)) x[length(x):1L] else x
0524132人目の素数さん垢版2018/09/11(火) 08:48:42.34ID:QUqp/jpE
!を引数が数値のときは0か否かを返す関数と理解すれば
if(!0) print(!1)の結果もサクッとわかる。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況