X



トップページ数学
1002コメント395KB
【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
レス数が950を超えています。1000を超えると書き込みができなくなります。
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/
0854132人目の素数さん
垢版 |
2020/08/06(木) 05:32:55.68ID:meNNWVIo
>>850
f <- function(...){
v=c(...)
ans=1
for(i in v) ans=ans*i
ans=ifelse(ans>0,ans,-ans)
ans
}

> f(-1,2,3)
[1] 6
> f(1 -2,-3,-4,-5)
[1] 60
0855132人目の素数さん
垢版 |
2020/08/06(木) 05:34:50.08ID:meNNWVIo
>>850
入力はベクトルだったから、

> f <- function(v){
+ ans=1
+ for(i in v) ans=ans*i
+ ans=ifelse(ans>0,ans,-ans)
+ ans
+ }
> f(c(-1,2,3))
[1] 6
> f(c(1 -2,-3,-4,-5))
[1] 60
0856132人目の素数さん
垢版 |
2020/08/06(木) 06:04:14.18ID:meNNWVIo
再帰だとこんな感じかな?

f <- function(...){
v=c(...)
n=length(v)
sub<-function(n){
if(n==0) return(1)
else v[n]*Recall(n-1)
}
sub(n)
}
> f(2,3,4)
[1] 24
> f(2,3,4,5,6)
[1] 720
0859132人目の素数さん
垢版 |
2020/08/06(木) 08:49:09.44ID:E/ufUouA
再帰版はこんな感じかな。
rec.prod <- function(x) {
# 再帰により x の要素の絶対値の積を求める。
# 実際には prod(abs(x)) が良い。
l <- length(x) # ベクトルの要素数
if (l == 0) # 空のベクトルなら
return(1) # 積は1
x1.a <- abs(x[1])
if (l == 1)
x1.a
else
x1.a * rec.prod(x[-1])
}
0860132人目の素数さん
垢版 |
2020/08/06(木) 11:42:21.63ID:rivMs4GJ
質問者本人です。
皆様のお力添えのおかげで無事問題を解くことができました。
初心者質問にやさしく回答して頂いて感謝しかありません。

本当にありがとうございました。
0861132人目の素数さん
垢版 |
2020/08/06(木) 19:28:54.17ID:meNNWVIo
>>859
この方が>856みたいに関数の中で関数を定義とかなくてカッコいいと思ったのでsystem.timeで時間を比較しようと思って実験を始めたら、
何故か、rec.prodの方がoverflowしやすいなぁ。
頭からかけても尻からかけても同じじゃないかと思うんだが。

> prod(1:100)
[1] 9.332622e+157

> rec.prod <- function(x) {
+ # 再帰により x の要素の絶対値の積を求める。
+ # 実際には prod(abs(x)) が良い。
+ l <- length(x) # ベクトルの要素数
+ if (l == 0) # 空のベクトルなら
+ return(1) # 積は1
+ x1.a <- abs(x[1])
+ if (l == 1)
+ x1.a
+ else
+ x1.a * rec.prod(x[-1])
+ }
> rec.prod(1:100)
[1] NA
Warning message:
In x1.a * rec.prod(x[-1]) : NAs produced by integer overflow

> f <- function(...){
+ v=c(...)
+ n=length(v)
+ sub<-function(n){
+ if(n==0) return(1)
+ else v[n]*Recall(n-1)
+ }
+ sub(n)
+ }
> f(1:100)
[1] 9.332622e+157
0862132人目の素数さん
垢版 |
2020/08/06(木) 20:06:06.68ID:meNNWVIo
比較のために、関数名の長さを同じにして、時間のかかるRecallを関数名にしてsystem.timeで比較してみた。

> rm(list=ls())
> rp <- function(x) {
+ # 再帰により x の要素の絶対値の積を求める。
+ # 実際には prod(abs(x)) が良い。
+ l <- length(x) # ベクトルの要素数
+ if (l == 0) # 空のベクトルなら
+ return(1) # 積は1
+ x1.a <- abs(x[1])
+ if (l == 1)
+ x1.a
+ else
+ x1.a * rp(x[-1])
+ }
> f1 <- function(...){
+ v=c(...)
+ n=length(v)
+ sub<-function(n){
+ if(n==0) return(1)
+ else v[n]*Recall(n-1)
+ }
+ sub(n)
+ }
> f2 <- function(...){
+ v=c(...)
+ n=length(v)
+ sub<-function(n){
+ if(n==0) return(1)
+ else v[n]*sub(n-1)
+ }
+ sub(n)
+ }


> system.time(replicate(1e5,prod(1:10)))
user system elapsed
0.11 0.00 0.11
> system.time(replicate(1e5,rp(1:10)))
user system elapsed
2.64 0.00 2.64
> system.time(replicate(1e5,f1(1:10)))
user system elapsed
2.44 0.01 2.47
> system.time(replicate(1e5,f2(1:10)))
user system elapsed
1.86 0.00 1.87
0863132人目の素数さん
垢版 |
2020/08/06(木) 20:31:17.99ID:E/ufUouA
それはね、856は厳密な意味での再帰ではないから速いしリ、ソースを食わないんだよ。ループを再帰風に書いただけだから。それよりもループのほうが速いに決まっている。
この問題を再帰で解くのはムダ以外の何ものでもない。
0864132人目の素数さん
垢版 |
2020/08/06(木) 20:33:25.51ID:w8yiRRv5
>>863
喩えれば、
親分が子分を再帰で酷使しているだけだから親分は消耗しない
という理解でいい?
0865132人目の素数さん
垢版 |
2020/08/06(木) 20:47:18.11ID:E/ufUouA
全然違う。
再帰は、複雑な問題をより小さい問題に分割することがキモだ。
856は元のベクトルはそのまま変わらずに存在していて、ある特定の要素を一つずつ処理しているからループとやってることは変わりない。
859は、一つ短いベクトルを自分自身に処理させているから真の再帰なのだ。
0866132人目の素数さん
垢版 |
2020/08/06(木) 22:25:29.65ID:meNNWVIo
>>865
f自身は再帰関数じゃないけど、呼び出しているsubは再帰関数では?

こういうのと同じ。
f <- function(x){ # 数列の和の階乗を返す
m=sum(x)
sub <- function(n){
if(n==1) return(1)
else{
return(n*Recall(n-1))
}
}
fact(m)
}

> f(c(1,2,3))
[1] 720
0867132人目の素数さん
垢版 |
2020/08/06(木) 22:50:49.72ID:XP8VEZbb
>>865
(ご入力訂正)
f自身は再帰関数じゃないけど、呼び出しているsubは再帰関数では?

こういうのと同じ。
f <- function(x){ # 数列の和の階乗を返す
m=sum(x)
sub <- function(n){
if(n==1) return(1)
else{
return(n*Recall(n-1))
}
}
sub(m)
}

> f(c(1,2,3))
[1] 720
0868132人目の素数さん
垢版 |
2020/08/07(金) 21:08:59.64ID:S7qsZ31k
856はsub()の引数がvでなくnなことと、nの入力に対して関数外のv[n]が帰ってくるのが、少し気になるかも
856が再帰っぽくないってのは、859はxを分割・再帰していってるのに対して、856はnを減じていってその都度vのn番目の値を参照してるところかな

それから、859がrec.prod(1:13)であっさりオーバーフローしてしまうのは、integer型だから
あと実行速度が少し遅いのは、xl.aへの代入操作と、if(l ==1){}の余分な条件分岐のせいだね

その辺を修正してやれば、こんな感じかな
# 再帰で問2
f <- function(x){
if(length(x) == 0) return(1)
abs(x[1]) * f(x[-1])
}
0869132人目の素数さん
垢版 |
2020/08/08(土) 05:40:19.06ID:2ggSSq05
>>868
勉強になりました。

ついでにwhile版を書いてみました。
f <- function(x){
ans=1
while(length(x)){
ans=ans*abs(x[1])
x=x[-1]
}
ans
}
0870132人目の素数さん
垢版 |
2020/08/08(土) 09:18:18.60ID:FvlAeRBY
>>868
859が遅い根本の原因は、x[-1] が生成されること。
他の指摘は、細かい高速化の工夫だから初心者に薦めるのはどうかと。
現に869で全く実用的に意味のないコードを書いているし。
題意を素直に表したほうがよいのでは?
絶対値の積は、積の絶対値と等しいから、absを呼ぶのは1回で済むが、何も説明無しにそうするのは私的にはアウトだ。メンテナンスの時に自分や他人が苦しむから。
0871132人目の素数さん
垢版 |
2020/08/08(土) 11:01:30.91ID:559rm1Tc
>>870
意味不明なこと言いだしてるが大丈夫か、落ち着け
859は、無駄な条件分岐あるし、すぐオーバーフローするし、コードが冗長だしで、それこそ初心者以外にもNGだぞ

絶対値の積うんぬんに関しては、859と同じでabsを毎回呼んでる、余計な代入操作が無いだけだ
落ち着いてコードを見ろ

速度うんぬんの話はこれまで話題に出てきたように、856と比べての話だ、話についてこれないなら無理に入ってこなくていい
別に高速化を目的としてるわけじゃなく、859から冗長な部分やオーバーフローの原因を取り除いた結果高速化されたってだけだ

だが、速度が遅い原因がxl.aへの代入でなく、x[-1]作成が原因てのはそのとおりだ
文章を書いてる途中で、オーバーフローの原因(代入操作はこっちだ)と勘違いしてしまったようだ
これは訂正に感謝だ
0872132人目の素数さん
垢版 |
2020/08/08(土) 11:24:32.96ID:FvlAeRBY
>>871
おまえこそもちつけ。
再帰は、再帰の停止条件と、自分自身が行う作業に分離できる。
この場合の停止条件は、要素が1つになったときと考えるのが自然だろう。
数学的には要素が0でもよいし、Rの場合はそれでうまくいくから問題はない。だが、そういった詳細を何も説明せずにこれでよい、と示すのはどうかな?
あと、絶対値を取ったのを代入しているのは、この作業が複雑になった場合の修正の確実さを優先するためで、優秀なバイトコンパイラであれば速度の差はなくなる。
0873132人目の素数さん
垢版 |
2020/08/08(土) 23:06:27.95ID:UlZ+DmHh
一人だけエラー吐いて、まともに動かない関数書いた無能が、
それでも、恥ずかしげもなく、一生懸命マウント取ろうとあがく姿は、
滑稽で哀れになってくるわ
0874132人目の素数さん
垢版 |
2020/08/13(木) 17:34:36.29ID:5b54QocS
>859がrec.prod(1:13)であっさりオーバーフローしてしまうのは、integer型だから
の意味が理解できなくて、実験してみた。

> rec.prod <- function(x) {
+ l <- length(x)
+ if (l == 0)
+ return(1)
+ x1.a <- abs(x[1])
+ if (l == 1)
+ x1.a
+ else
+ x1.a * rec.prod(x[-1])
+ }
>
>
> rec.prod(1:13)
[1] NA
Warning message:
In x1.a * rec.prod(x[-1]) : NAs produced by integer overflow
> rec.prod(as.numeric(1:13))
[1] 6227020800
> rec.prod(c(1,2,3,4,5,6,7,8,9,10,11,12,13))
[1] 6227020800
> rec.prod(c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,13L))
[1] NA
Warning message:
In x1.a * rec.prod(x[-1]) : NAs produced by integer overflow

integer型のデータだとオーバーフローしちゃうけど、as.numericでdouble型にするとエラーがでない。

一方、

> f <- function(x){
+ if(length(x) == 0) return(1)
+ abs(x[1]) * f(x[-1])
+ }
> f(1:13)
[1] 6227020800
> f(as.numeric(1:13))
[1] 6227020800
> f(c(1,2,3,4,5,6,7,8,9,10,11,12,13))
[1] 6227020800
> f(c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,13L))
[1] 6227020800
>

とエラーがでないなぁ。

何故だろう?
0875132人目の素数さん
垢版 |
2020/08/20(木) 13:26:56.75ID:mPUCNi08
Package ‘XXX’ was installed before R 4.0.0: please re-install it
とメッセージがでてXXXをインストールすると次は

Package ‘YYY’ was installed before R 4.0.0: please re-install it
とでてきてうんざりしていた。

stackoverflow.comで以下の答をみつけて解決した。

.libPaths()
update.packages(ask=FALSE, checkBuilt=TRUE)
0876132人目の素数さん
垢版 |
2020/09/09(水) 22:54:07.12ID:IR7822fG
ありがとうございます
0877132人目の素数さん
垢版 |
2020/10/19(月) 07:15:12.45ID:21zikI9w
PならばQ をパイプで P %=>% Q として論理演算で遊んでみた。

"
問題 : 「シリツ医 ならば (馬鹿 ならば 裏口 である)」という命題と同値な命題はどれか?

1 : シリツ医 ならば (裏口 ならば 馬鹿 である)
2 : 馬鹿 ならば (シリツ医 ならば 裏口 である)
3 : 馬鹿 ならば (裏口 ならば シリツ医 である)
4 : 裏口 ならば (シリツ医 ならば 馬鹿 である)
5 : 裏口 ならば (馬鹿 ならば シリツ医 である)
"

# PならばQ ≡ (P かつ (Qでない))ではない
'%=>%' = function(P,Q) !(P & !Q)
# premise
A = function(S,B,U) S %=>% (B %=>% U)

# choice
B1 = function(S,B,U) S %=>% (U %=>% B)
B2 = function(S,B,U) B %=>% (S %=>% U)
B3 = function(S,B,U) B %=>% (U %=>% S)
B4 = function(S,B,U) U %=>% (S %=>% B)
B5 = function(S,B,U) U %=>% (B %=>% S)

# premise => choice
C1 = function(S,B,U) A(S,B,U) %=>% B1(S,B,U)
C2 = function(S,B,U) A(S,B,U) %=>% B2(S,B,U)
C3 = function(S,B,U) A(S,B,U) %=>% B3(S,B,U)
C4 = function(S,B,U) A(S,B,U) %=>% B4 (S,B,U)
C5 = function(S,B,U) A(S,B,U) %=>% B5 (S,B,U)

# combination grid of TRUE & FALSE
gr=expand.grid(c(T,F),c(T,F),c(T,F))

# test for premise => choice
all(mapply(C1,gr[,1],gr[,2],gr[,3]))
all(mapply(C2,gr[,1],gr[,2],gr[,3]))
all(mapply(C3,gr[,1],gr[,2],gr[,3]))
all(mapply(C4,gr[,1],gr[,2],gr[,3]))
all(mapply(C5,gr[,1],gr[,2],gr[,3]))
0878132人目の素数さん
垢版 |
2020/10/19(月) 07:15:28.30ID:21zikI9w
# choice -> premise
D1 = function(S,B,U) B1(S,B,U) %=>% A(S,B,U)
D2 = function(S,B,U) B2(S,B,U) %=>% A(S,B,U)
D3 = function(S,B,U) B3(S,B,U) %=>% A(S,B,U)
D4 = function(S,B,U) B4(S,B,U) %=>% A(S,B,U)
D5 = function(S,B,U) B5(S,B,U) %=>% A(S,B,U)

# test for choice -> premise
all(mapply(D1,gr[,1],gr[,2],gr[,3]))
all(mapply(D2,gr[,1],gr[,2],gr[,3]))
all(mapply(D3,gr[,1],gr[,2],gr[,3]))
all(mapply(D4,gr[,1],gr[,2],gr[,3]))
all(mapply(D5,gr[,1],gr[,2],gr[,3]))
0879132人目の素数さん
垢版 |
2020/11/17(火) 19:55:57.27ID:UJMPy762
,で文字列を分けようとしたらうまくいかなかったがHELPをみたら解説してあった。

> #.で文字列を分ける
> unlist(strsplit('3.14','.'))
[1] "" "" "" ""
> unlist(strsplit('3.14','\.')
Error: '\.' is an unrecognized escape in character string starting "'\."
>

> unlist(strsplit('3.14','[.]'))
[1] "3" "14"
> unlist(strsplit('3.14','.',fixed=TRUE))
[1] "3" "14"
0880132人目の素数さん
垢版 |
2020/11/17(火) 20:18:32.66ID:/TSutyYc
unlist(strsplit("3.14", "¥¥."))
人に見てもらいたかったら読みやすく書けよ。アンタのプログラムはいつも読みにくい。
0882132人目の素数さん
垢版 |
2020/12/10(木) 02:17:40.15ID:Whv7aYu3
数値積分をさせていたら
初めてみるこんなエラーが返ってきた。
roundoff error is detected in the extrapolation table

困ったときのstackoverflow.comで
https://stackoverflow.com/questions/56384330/integrate-function-returning-roundoff-error-after-working-previously

As for the integration problem, package cubature generally does a better job when integrate
と解決法が記載されていた

integrate(fn, lower, upper)$value
でエラーが返ってきたが、
cubintegrate(fn, lower,upper, method='pcubature')$integral
とするとエラーなしに計算してくれた。

(備忘録)
0883132人目の素数さん
垢版 |
2020/12/12(土) 23:25:15.53ID:DvLXeu4z
それエラーが出るべきなのに出ない誤りなんじゃ、って可能性はないの?
0884132人目の素数さん
垢版 |
2020/12/13(日) 08:12:33.91ID:xmsEH+j9
>>883
別スレの問題を「プログラムで面積を数値計算させていたらエラー発生

体験したければ読みにいコードの下記をどうぞ。

r= 0.66017210648907 ; s=2.89088405538017

# 面積計算にintegrate で エラー
sub <- function(c,Area1=1){ # c 円Cの中心のx座標
b0=(c^2+r^2-s^2)/(2*c) # B(b0,b1) # 円Cと円Oの交点Bの座標
b1=sqrt(r^2-(c^2+r^2-s^2)^2/(4*c^2))

blue = function(x) sqrt(s^2-(x-c)^2) # 円Cの方程式
BLUE= integrate(blue,b0,c+s)$value*2 # 青の面積
green = function(x) sqrt(r^2-x^2) # 円Oの方程式
GREEN=integrate(green,-r,b0)$value*2 # 緑の面積

GREEN+BLUE-Area1 # GREEN+BLUE=1
}
sub=Vectorize(sub)
x=seq(-r-s,r-s,length=100) ; plot(x,sub(x),pch=19) ; abline(h=0,lty=3)


# 面積計算にcubintegrate でエラーなし
library(cubature)
sub <- function(c,Area1=1){ # c 円Cの中心のx座標
b0=(c^2+r^2-s^2)/(2*c) # B(b0,b1) # 円Cと円Oの交点Bの座標
b1=sqrt(r^2-(c^2+r^2-s^2)^2/(4*c^2))

blue = function(x) sqrt(s^2-(x-c)^2) # 円Cの方程式
BLUE= cubintegrate(blue,b0,c+s,method="pcubature")$integral*2 # 青の面積
green = function(x) sqrt(r^2-x^2) # 円Oの方程式
GREEN=cubintegrate(green,-r,b0,method='pcubature')$integral*2 # 緑の面積

GREEN+BLUE-Area1 # GREEN+BLUE=1
}
sub=Vectorize(sub)
x=seq(-r-s,r-s,length=100) ; plot(x,sub(x),pch=19) ; abline(h=0,lty=3)
0885132人目の素数さん
垢版 |
2020/12/13(日) 08:15:08.06ID:xmsEH+j9
入力の省力化にこんな関数を道具箱に詰めた

# 定積分
integral <- function(fn,lwr,upr,...){
cubature::cubintegrate(fn,lwr,upr,method='pcubature',...)$integral
}
0886132人目の素数さん
垢版 |
2020/12/13(日) 09:32:37.11ID:xmsEH+j9
>>884
library(MASS)にareaという面積計算の関数があるのを思い出したのでやってみた。

library(MASS)
r= 0.66017210648907 ; s=2.89088405538017
# 面積計算にMASS::area
sub <- function(c,Area1=1){ # c 円Cの中心のx座標
b0=(c^2+r^2-s^2)/(2*c) # B(b0,b1) # 円Cと円Oの交点Bの座標
b1=sqrt(r^2-(c^2+r^2-s^2)^2/(4*c^2))

blue = function(x) sqrt(s^2-(x-c)^2) # 円Cの方程式
BLUE=area(blue,b0,c+s)*2 # 青の面積
green = function(x) sqrt(r^2-x^2) # 円Oの方程式
GREEN=area(green,-r,b0)*2 # 緑の面積

GREEN+BLUE-Area1 # GREEN+BLUE=1
}
sub=Vectorize(sub)
x=seq(-r-s,r-s,length=100) ; plot(x,sub(x),pch=19) ; abline(h=0,lty=3)

こっちはエラーがでない。
0887132人目の素数さん
垢版 |
2020/12/21(月) 20:43:26.34ID:gcvC1Sv7
func <- function (...) {
return(anova(...))
}
func(fit1, fit2, fit3)
オブジェクトの引数をうけとって、関数内の関数anovaに渡して
ちゃんと動かすにはどうしたらいいですか?
0889132人目の素数さん
垢版 |
2020/12/23(水) 11:45:33.99ID:DPeLDm1M
>>887
> mydata <- data.frame(x = runif(10), y = runif(10), z = runif(10))
> xy <- lm(y ~ x, data = mydata)
> zy <- lm(y ~ z, data = mydata)
> func <- function (...) {
return(anova(...))
}
> func(xy, zy)
Analysis of Variance Table

Model 1: y ~ x
Model 2: y ~ z
Res.Df RSS Df Sum of Sq F Pr(>F)
1 8 0.40535
2 8 0.39312 0 0.012234

ちゃんと動くけど。
何がどう問題なのかを明確にして質問しないと助言を得られないよ。
0890132人目の素数さん
垢版 |
2021/01/03(日) 22:00:14.73ID:8tLYm46h
やっぱり、パッケージになっている関数は高速だな。
1万までの素数を求める

> rm(list=ls())
> primes <- function(n) (1:n)[-outer(2:n,2:n)][-1]
> system.time(primes(10000))
user system elapsed
0.60 1.92 2.88

> rm(list=ls())
> library(numbers)
> system.time(Primes(10000))
user system elapsed
0.00 0.00 0.03
0891132人目の素数さん
垢版 |
2021/01/21(木) 00:00:54.88ID:KZXQ/VTY
時刻と、その時に従業員がいた場所(住所)がデータとして一覧化されていて、
いつ、どこによくいるかをクラスタリングしたいのですがRは出来るのでしょうか?
0893132人目の素数さん
垢版 |
2021/02/14(日) 11:56:55.00ID:g9kE6hlo
IPB size
1 I 82571
2 B 4909
3 B 230
4 B 231

こんな感じのデータフレームを複数ファイルを読み込んで
ファイル別に横につなげる場合どのようにfor文を書けばいいですか?
0896132人目の素数さん
垢版 |
2021/03/16(火) 13:05:28.85ID:cJpJJpsg
# 振幅1の正弦波の一周期の長さを求めよ
の計算に、一般化して計算できるように関数を書いてみたのだが、
文字列での入力が必要でどうも美しくない。

# 関数y=f(x)の曲線でx=from からx=toまでの長さを求める

CurveLength <- function(f='sin(x)',from=-pi,to=pi){
str=paste("deriv(~ ",f,",","'x',func=TRUE)")
Df <- eval(str2lang(str))
f1 <- function(x) as.numeric(attributes(Df(x)))
f1=Vectorize(f1)
integrate(function(x) sqrt(1+f1(x)^2), from, to, rel.tol = 1e-12)
}

計算としてはあっていると思う。
> CurveLength()
7.640396 with absolute error < 2.6e-13

> CurveLength('log(1+cos(x))',0,pi/2)
1.762747 with absolute error < 2e-14

もっとエレガントなコードがあればご教示をお願いします。
0899132人目の素数さん
垢版 |
2021/06/05(土) 21:13:05.02ID:5b0TiKZo
R version 4.1.0 (2021-05-18) -- "Camp Pontanezen" になってパイプに標準で対応したのは嬉しい。
function(x) が \(x)と略記可能になった。

ちょっと練習

f <- \(x) sample(100,x,rep=TRUE)
f(50) |> sort() |> unique() |> length()

> f <- \(x) sample(100,x,rep=TRUE)
> f(50) |> sort() |> unique() |> length()
[1] 40

詳細は
https://cran.r-project.org/bin/windows/base/NEWS.R-4.1.0.html
0900132人目の素数さん
垢版 |
2021/06/06(日) 12:41:44.43ID:X+DUyz8T
Vectorize()もパイプで受けてくれた。

(\(n) sample(10,n, replace = TRUE) |> unique() |> sort()) |> Vectorize() -> f.new
f.new(1:5)

f.old <- Vectorize(function(n){
sort(unique(sample(10,n,replace = TRUE)))})
f.old(1:5)
0901132人目の素数さん
垢版 |
2021/06/06(日) 12:54:15.47ID:X+DUyz8T
|> curve()は描画されなかった。

(\(x) sqrt(1-x^2)) |> Vectorize() |> curve()

> (\(x) sqrt(1-x^2)) |> Vectorize()) |> curve()
Error: unexpected ')' in "(\(x) sqrt(1-x^2)) |> Vectorize())"


(\(x) sqrt(1-x^2)) |> Vectorize() -> fn
curve(fn)
1/4円を描画
0902132人目の素数さん
垢版 |
2021/06/06(日) 22:14:15.22ID:X+DUyz8T
パイプで速度が落ちるかと思ったけど変わらないね。

> (\(x) sample(1000,x,replace=TRUE) |> sort() |> unique() |> length()) -> f.new
> system.time(replicate(1e5,f.new(5000)))
user system elapsed
28.66 0.01 28.70

> f.old <- function(x) length(unique(sort(sample(1000,x,replace=TRUE))))
> system.time(replicate(1e5,f.old(5000)))
user system elapsed
28.65 0.00 28.67
0903132人目の素数さん
垢版 |
2021/06/06(日) 22:37:59.70ID:jjPG368x
そのパイプを使ったコードをquote関数に噛ませば分かるけど実際はパーサーが下のコードに変換してるだけらしい。
なので実態としては演算子や関数ではないのでオーバーヘッドが生じないとのこと。
0904132人目の素数さん
垢版 |
2021/06/08(火) 05:41:54.05ID:uSV089kB
>>903
レスありがとうございます。早速、やってみました。

> quote((\(n) sample(10,n, replace = TRUE) |> unique() |> sort()) |> Vectorize())
Vectorize((function(n) sort(unique(sample(10, n, replace = TRUE)))))
0905132人目の素数さん
垢版 |
2021/06/08(火) 06:02:44.83ID:uSV089kB
dplyrのパイプ%>%だと他に引数がないときは関数の()は省略できるけど
今回、搭載された|>は()がないとエラーになるな。

> library(dplyr)
> sample(10,10,replace=TRUE) %>% sort
[1] 1 2 4 5 6 7 7 7 7 8
> sample(10,10,replace=TRUE) %>% sort(decreasing = TRUE)
[1] 9 9 7 6 5 5 3 1 1 1

> sample(10,10,replace=TRUE) |> sort
Error: The pipe operator requires a function call as RHS
> sample(10,10,replace=TRUE) |> sort()
[1] 3 4 5 5 6 6 8 8 8 10
> sample(10,10,replace=TRUE) |> sort(decreasing = TRUE)
[1] 10 10 9 8 7 7 6 6 5 2
0906132人目の素数さん
垢版 |
2021/06/08(火) 06:10:22.55ID:uSV089kB
パイプで送る関数に引数が1個なら自分でパイプを定義するのと変わらないなぁ。
オンラインで実行できるサイトだと必ずしも最新版のRに対応していないし、外部ライブラリ非対応のところもあるので
自分でパイプを定義の方がいいかも

'%|%' <- function(x,FUN) FUN(x)

> sample(10,10,replace=TRUE) %|% sort %|% unique
[1] 1 3 5 6 7
0907132人目の素数さん
垢版 |
2021/08/29(日) 23:23:03.95ID:OFN46wh5
# 備忘録

hogehoge <- function(x){
cat(deparse(substitute(x)),'=',x,'\n')
}
ch='Swiss'
hogehoge(ch)

> hogehoge(ch)
ch = Swiss
0908132人目の素数さん
垢版 |
2021/11/05(金) 22:47:20.72ID:lTyg7nhh
これ↓、思ったように動かないけど、普通?
iris[any(iris[,3]==c(6.1,5.1)) ,]

いまいちR言語の仕様がわからん。
0909132人目の素数さん
垢版 |
2021/11/05(金) 23:38:14.16ID:I43ryX9p
何をしたいのか説明できない理系脳かな?
適当に推測するに、
iris[iris[, 3] %in% c(6.1, 5.1), ]
0911132人目の素数さん
垢版 |
2021/11/06(土) 21:45:56.76ID:8hjJFETA
SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?

Rの有利な点は表を容易に分割→編集→結合できる点で、Accessの有利な点はクエリを何段にも重ねることで表を視覚的に扱えることだと思うんだけど、どうかな?

要約すると、細かいとこに手が届くのと、そうではないけど直感的なところ。
0912132人目の素数さん
垢版 |
2021/11/06(土) 21:53:39.63ID:8hjJFETA
SQLがAccessの例に限定されちゃってるね。
でも同じように文字で書くなら、Rの方が便利に思えるな。

Officeが使える環境でR使ってるから、Rだけの環境に移行すればどんな不便が発生するか検討中なんだけど、どう思う?
0913132人目の素数さん
垢版 |
2021/11/08(月) 19:14:28.35ID:xqrS4yV9
>>911
> SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
何を言っているのか分からないが、用意されいている分析手法の豊富さが全く違うだろ。
例えば、多重検定の検定法とかSQLにあるの?ノンパラメトリックの多重検定とかちゃんとできるの?
0914132人目の素数さん
垢版 |
2021/11/08(月) 19:14:46.14ID:xqrS4yV9
>>911
> SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
何を言っているのか分からないが、用意されいている分析手法の豊富さが全く違うだろ。
例えば、多重検定の検定法とかSQLにあるの?ノンパラメトリックの多重検定とかちゃんとできるの?
0915132人目の素数さん
垢版 |
2021/11/09(火) 20:40:06.49ID:hGmtIAbe
そうだよね。
組み合わせて使うもんだよね。SQLとRは。
ただ、境界線をどこで引くべきか微妙なところで悩む。RだとRStudioのレポートとして残せるから、分析手順を残していくことを考えると極力R使った方がいいのかな。
0916132人目の素数さん
垢版 |
2021/12/04(土) 13:16:48.05ID:3GLpEIlX
いや、SQLとRは全くの別物だろ
SQLはデータベースのマネジメントシステムで、
Rはデータ分析のツールじゃん
0923132人目の素数さん
垢版 |
2022/03/02(水) 03:27:08.75ID:RV9q7yNr
今更レスだけどなんでaccessと比べるのか、excelじゃねーの

excelは商用だけあって機能的には検定回帰成分分析因子分析何でもできてRに劣るところは無いし、統計以外なら最適化が強い

Rより遅いしVBAは醜いし、365なんていきなり環境ぶっ壊されかねないからRに安住するけど
0924132人目の素数さん
垢版 |
2022/03/02(水) 03:30:48.43ID:RV9q7yNr
インタラクティブに使う分にはCSE使えるexcelの方が便利だな
ぜひともRに取り入れたい機能の一つ
0925132人目の素数さん
垢版 |
2022/03/02(水) 03:42:31.09ID:RV9q7yNr
excelで巨大データ扱うにはaccessインテグレーション機能で補完し合うといいとは聞くけど、俺のアカデミック割のofficeではaccessはハブられてた悲しみ
0928132人目の素数さん
垢版 |
2022/03/18(金) 15:05:36.24ID:Z+B2NJF6
contourのzlimはどう設定すればよいのでしょうか?

https://navaclass.com/mahalanobis/
ユークリッド距離のzlimは
contour(x,y,z.E,zlim=c(0,3),nlevels = 5,add=T)
のようにzlim=c(0,3)に設定されているのですが、
マハラノビス距離のzlimは
contour(x,y,z.D,zlim=c(0,1),nlevels = 5,labels="", add=T)
のようにzlim=c(0,1)に設定されています。

確かに、ユークリッド距離のほうは(1, 1)の点が1.0の等高線上にありますし、
マハラノビス距離のほうもAは0.75、Bは2.2という距離に相応しいところに点があります。

ただ、zlim=c(0,3)の意味はきっと0から3までの範囲に限るという意味なんでしょうが、
z.Eとの値も見ても3で区切られているようには見えません。
実験してみましたが、z.Eのほうのzlimは3.5、z.Dのほうのzlimは1.4で等高線が変化するようです。

これでは新たな相関係数を使ったときにどう設定すればよいのか分かりません。
どうか教えて下さい。
0929132人目の素数さん
垢版 |
2022/03/18(金) 15:25:12.51ID:3f0eXSLb
>>928
xlim, ylimは指定した値でスパッと切るわけではないので(前後に余裕を持たせるようになっている)、
zlimも同じ仕様だと想像するよ。
xlimやylimで指定した特定の値でスパッと切るオプションがあったと思うので、
zlimにも有効でないかどうか、そこから調べて見れば?
0930132人目の素数さん
垢版 |
2022/03/18(金) 17:48:09.58ID:Z+B2NJF6
>>929
ありがとうございます。
今、いろいろ計算した結果、等高線の位置自体は正しいことが判りました。
ただ、問題は等高線の刻みがzlimと相関係数の組み合わせによって変わることです。
具体的には、等高線が0.5刻みになったり1.0刻みになったり0.25刻みになったりします。
にもかかわらずnlevelsは5本のままなので、全体が膨らんだり縮んだり、見た目が全然違ってくるんですよね。
その度に手でzlimの値を1とか3とか5に変えてあげないといけません…これらの数字はまったく理解できません。

なので質問を変えさせていただいて、
相関係数が0以外の時でも等高線上に0.5, 1.0, 1.5, ...などのラベルを強制的に表示する方法は無いでしょうか?
相関係数が0(つまりユークリッド距離)の時は等高線上にそれらの数値が表示されます。
それが相関係数が0.1にでもなった途端に表示されなくなります
(数値表示用に輪が途切れた形でブランクは空いているようなのですが)。
等高線上に0.5, 1.0, 1.5, ...などのラベルが表示されるようになれば、上記の問題も許容できると思います。

余談ですが、
>スパッと切るオプション

調べてみると、xaxs="i"のことのようですね。
"r"だとグラフの端に4%の余白があったのが"i"だと無くなりました。
0931132人目の素数さん
垢版 |
2022/03/18(金) 18:10:24.04ID:Z+B2NJF6
すみません、labels=“”になっているというオチでした。
とりあえず、これで問題ないか確認します。
0932132人目の素数さん
垢版 |
2022/03/21(月) 13:18:24.75ID:k7XqFrKG
ご助力をいただきたく、質問いたします。

対象データ
データフレームA内のB列, <chr>型 中身は例として 文字列で"2022/02/24"が入っている。

やりたいこと
この文字列をRのDate型に変換したい

やってみたこと。
tidyverseを用いて
A %>% select(B) %>% as.Date()
これだとエラーが出ました。
エラー文は「'.'からクラス"Date"へ変換はできません」

どうやったらこのB列をRのDate型に変換できますでしょうか。
0933132人目の素数さん
垢版 |
2022/03/21(月) 15:20:29.09ID:SKGsv+wa
>>932
パイプ処理したいならlubridateパッケージが便利です。チートシート(英語)が公開されているので、使い方は確認してみてください。

パッケージ名のスペル間違ってたらごめん。
0934132人目の素数さん
垢版 |
2022/03/21(月) 17:46:23.39ID:qn67+d1x
>>932
変換できない理由は、dplyr::select()関数の返り値がdata.frame型で
as.Date()関数の引数がベクトル型でなければならないからです。
なので、

as.Date(A$B)

とすれば、Date型でベクトルな返り値を得ることができます。tidyverseを
使いたい(というかパイプで処理したい)なら

A %>%
.$B %>% # ベクトルとして取り出す
as.Date()

となります。
返り値をdata.frame型で得たい場合は、dplyr::mutate()関数を使って

A %>%
dplyr::select(B) %>%
dplyr::mutate(B = as.Date(B))

とします。

tidyverseは、基本的にデータフレームを入力としデータフレームを出力と
しますので、列をベクトルとして処理したい場合はmutate()関数を使う必要が
あります。
0935132人目の素数さん
垢版 |
2022/03/21(月) 20:28:10.47ID:k7XqFrKG
>933様
>934様
ご教示ありがとうございます。
参考にまずは試してみます。
0936132人目の素数さん
垢版 |
2022/03/22(火) 07:49:54.09ID:kcYWMWlK
>>932
selectじゃなくてpullにすれば動くよ
0937132人目の素数さん
垢版 |
2022/03/22(火) 12:12:27.45ID:CNKDZNvw
pull()は知らなかったけど引数を二つ指定するとnamed vectorも作れるんだな。
0938132人目の素数さん
垢版 |
2022/03/25(金) 19:24:11.66ID:YaAd0nW/
借金を返す手段は大増か
踏み倒し(=ハイパーインフレ)の2者選択。
今、日本はお金をどんどん刷って紙幣価値を下げ、
後者の道をまっしぐら。

「税金で借金を返せる難易度ランキング」

1位 日本     257%
2位 スーダン   210%
3位 ギリシャ   207%
4位 エリトリア  175%
5位 カーボベルデ 161%
6位 イタリア   155%
7位 スリナム   141%
://twitter.com/fujimaki_takesi/status/1505469787174227973?s=20&t=3LeCpoO4fcZVopj2x8b9Dw

         日本から始まる世界的株式市場の大暴落

それが最終的な暴落であることがはっきりするや否や、
マ仆レーヤは出現するでしょう。
マ仆レーヤが公に世界に現れるにつれて、
UFOがとてつもない数で姿を表すでしょう
https://twitter.com/5chan_nel (5ch newer account)
0939132人目の素数さん
垢版 |
2022/03/27(日) 21:47:05.79ID:nv2FRWMk
質問いたします。よろしくお願いいたします。

ベクトル
a <- c(1, 2, 3, 3, 5, 5, 7) #1:7と連番にしたいが、一部値が重複している想定です
に対して、重複を修復するために

df <- data.frame(b=a, c=lag(a, default=a[1]-1))
apply(df, 1, function(x){ifelse(x[1]==x[2], x[1]+1, x[1])})

としましたが、applyを使っているのでかなり遅いです。
質問1:applyを使わない高速化できる手段はないでしょうか。
質問2:ifelseがベクトルに作用すると聞いたので(お恥ずかしいw)
    ifelse(df$b == df$a,
としようとしたのですがエラーが出ました。
  ifelseは異なる2つのベクトル(行数同じとしても)には作用できないのですね?
0940132人目の素数さん
垢版 |
2022/03/27(日) 21:55:41.37ID:C7ecChkw
>>939
何をどうしたいのか、具体的に書いてくれ。
何がしたいのか、さっぱりわからん。
c(1, 2, 3, 3, 5, 5, 7) を 1:7 にしたいだけなら、seq(along=a) でよいが、前と同じ値の場合は、前の値に1を足すというのであれば、rle を使えばなんとかなりそう。
0941132人目の素数さん
垢版 |
2022/03/27(日) 22:01:16.21ID:BmY4vlnd
質問が下手だと答えてもらえないぞ。
0942132人目の素数さん
垢版 |
2022/03/27(日) 22:03:58.44ID:nv2FRWMk
>>940
すいませんでした。詳しく書くと、
cベクトルにはcsvから読み込んだ、時間データの秒数が整数値で入っています。
(・csvデータには他に、時間データの年、月、日、時、分、秒、と
 全て整数値がそれぞれ別の列で入っています。
・このcsvデータは1秒サンプリングです。

ただそのデータは秒がたまに重複しているのです。
重複している時のルールとして、直前の、1秒前の時間の秒が秒列に入っています。
例で挙げたように
1, 2, 3, 3, 5, 5, 7, 8, 9, 9

この重複を訂正したいのです。
そこで考えたのが 939で挙げたスクリプトだったのですが、
あまりにも遅く(1日分のデータ24*60*60行を訂正するのに)
質問いたしました。
0943132人目の素数さん
垢版 |
2022/03/27(日) 22:13:43.93ID:UiNoGcwm
おれもさっぱり質問の意図が理解できないが、重複除去なら集合演算の
b <- unique(a)
でbは
> b
[1] 1 2 3 5 7
になるよ。
0944939
垢版 |
2022/03/27(日) 22:17:25.42ID:nv2FRWMk
>>943
回答ありがとうございます。わかりづらくてすいません。
重複除去ではなく、重複のです。
942に書いたように、
秒データが
1,2,3,4,5,6,7,8
とあるべきところが
1,2,3,3,5,5,7,8
のように4秒のところが直前の3秒に、6秒のところが直前の5秒になっています。
これを修正したいのです。
0945132人目の素数さん
垢版 |
2022/03/27(日) 22:24:40.36ID:BmY4vlnd
そういうことか。
なら
a <- 1:8
で置換しちゃえばいいんじやないの?
てかまず国語を勉強しよう。
0946939
垢版 |
2022/03/27(日) 22:30:24.14ID:nv2FRWMk
>>945
ありがとうございます。
確かに国語力ないですね、今から考えると、、、
必要な前提を書ききれていません。

さらに必要な前提は、データが24*60*60秒分全部なく、1、2秒分抜けているのです。
0947132人目の素数さん
垢版 |
2022/03/27(日) 22:34:34.62ID:C7ecChkw
例が悪いね。
本当に1秒ごとに確実にデータが来ているなら、seq でも使って新たに値を作ればいいのだが、
きっと、途中でデータが来ない場合もあるのだろう。
例としては、c(1, 2, 2, 2, 9, 9, 11) のようなほうがよいのでは?
この場合、c(1, 2, 3, 4, 9, 10, 11) という答えになればよいのだろう。

r <- rle(a)
res <- lapply(seq(along=r$length), function(i) seq(r$values[i], len=r$length[i]))
do.call(c, res)

これでできると思うが、これで遅いなら、重複のところだけを修正するようにすればよい。
0950939
垢版 |
2022/03/27(日) 22:38:26.76ID:nv2FRWMk
>>947
ありがとうございます。
参考に考えてみます。

>>948
返す返す申し訳ないです、、
0951939
垢版 |
2022/03/27(日) 22:41:51.48ID:nv2FRWMk
>>949

データの特徴は、
1。重複は2つ。
2。データの抜けは想定できない。
  1日に5分ほどのこともあれば(付け加えて言うと、1日のデータをファイルに保存している)
1日に1から3秒ほどの時もあります。(この時は、1日のデータをファイルに保存していない時)
レス数が950を超えています。1000を超えると書き込みができなくなります。

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