20/03/22 08:57:06 liILqu/N.net
# 感度0.7 特異度0.9のPCR検査で1000人中10人が陽性だったときの有病率の信頼区間をシミュレーションして計算するスクリプト
# アルゴリズムには自信がないw
sim <- function(n=1000,r=10,sen=0.7,spc=0.9,k=1e6,print=TRUE){
# n:検査件数 r:検査陽性数 sen=感度 spc=特異度 k:発生乱数の数,print:グラフ描画
prev=rbeta(k,1+r,1+n-r) # 有病率の事前分布を一様分布と仮定
PPV=prev*sen/( prev*sen + (1-prev)*(1-spc) ) # 検査特性を加味してPPV計算
prev.post = PPV*(1-spc)/(sen - PPV*(sen+spc-1)) # そのPPVから有病率を計算
# NPVでも同じ結果
# NPV=(1-prev)*spc/( (1-prev)*spc + prev*(1-sen)) # 検査特性を加味してNPV計算
# prev.post = (1-NPV)*spc/(spc - NPV*(sen+spc-1)) # そのNPVから有病率を計算
mean=mean(prev.post) # 期待値
median=median(prev.post) # 中央値
mode=density(prev.post)$x[which.max(density(prev.post)$y)] # 最頻値
LU=unlist(HDInterval::hdi(prev.post))[1:2] # 95%信頼区間
re=c(mean=mean,median=median,mode=mode,LU) # 事後有病率の代表値
if(print){ # ヒストグラム描画
par(mfrow=c(2,2))
hist(prev,freq=F,xlim=c(0,1)) ; lines(density(prev),lwd=2)
hist(PPV,freq=F,xlim=c(0,1)) ; lines(density(PPV),lwd=2)
hist(prev.post,freq=F,xlim=c(0,1)) ; lines(density(prev.post),lwd=2)
BEST::plotPost(prev.post)
par(mfrow=c(1,1))
}
print(round(re,4)) # 概算値表示
invisible(list(re,prev.post)) # 代表値と事後有病率を非表示で返す
}
sim(100,1)
sim(1000,10)
sim(10000,100)
sim(100000,1000)
836:132人目の素数さん
20/03/22 14:13:54 liILqu/N.net
>>797(自己レス)
間違いに気づいたので撤回します。
837:132人目の素数さん
20/03/23 14:55:08 iIfIhG5+.net
MCMCで解決してみた。
【富山県最強伝説】新型
838:コロナウイルスPCR検査件数 54人 陽性0人 ある集団から54人を無作為に選んでPCR検査したら陽性0であった。 PCR検査の感度0.7 特異度0.9としてこの集団の有病率の期待値と95%信頼区間を推測せよ。 #---------------------------------------------------------------------------- # 感度SEN, 特異度SPCの検査でN人中X人が陽性であったときの推定有病率prevalence # 弱情報事前分布はprevalence ~ dunif(0,UL) , UL:上限 #---------------------------------------------------------------------------- PCRj <- function(N,X,UL=1,SEN=0.7,SPC=0.9,verbose=TRUE){ # UL:upper limit of dunif(0,UL) library(rjags) modelstring=paste0(' model { x ~ dbin(p,n) p <- prev*sen + (1-prev)*(1-spc) prev ~ dunif(0,',UL,') } ') if(verbose & UL!=1) cat(modelstring) writeLines(modelstring,'TEMPmodel.txt') dataList=list(n=N,x=X,sen=SEN,spc=SPC) jagsModel = jags.model( file="TEMPmodel.txt" ,data=dataList,quiet=TRUE) update(jagsModel) codaSamples = coda.samples( jagsModel , variable=c("prev","p"), n.iter=1e6, thin=10) js=as.matrix(codaSamples) BEST::plotPost(js[,'prev'],xlab='prevalence',showMode = TRUE) ; lines(density(js[,'prev']),col='skyblue') round(c(mean=mean(js[,'prev']),HDInterval::hdi(js[,'prev'])[1:2]),10) } PCRj(100,1) PCRj(1000,10) PCRj(10000,100) PCRj(100000,1000) PCRj(54,0) PCRj(54,0,UL=0.1)
839:132人目の素数さん
20/04/03 19:48:06 MNrUuJMd.net
a b c d e f g h i j
1 -0.0377710 0.02994835 0.1779426 0.29057472 0.13252796 0.3279709 -0.3534731 -0.54812874 -0.3869768 -0.1233967
2 0.2707033 0.09238235 -0.1042958 -0.08485129 -0.02590955 0.2159095 -0.3338677 0.00865952 -0.1575856 0.0953795
840:132人目の素数さん
20/04/03 19:50:07 MNrUuJMd.net
上のDFを
library(psych)
ICC(DF)
で級内相間求めようとすると変な値でるんだけどなんででしょう?
841:132人目の素数さん
20/04/03 22:01:48 1EdxzcOL.net
> DF
V1 V2
a -0.03777100 0.27070330
b 0.02994835 0.09238235
c 0.17794260 -0.10429580
d 0.29057472 -0.08485129
e 0.13252796 -0.02590955
f 0.32797090 0.21590950
g -0.35347310 -0.33386770
h -0.54812874 0.00865952
i -0.38697680 -0.15758560
j -0.12339670 0.09537950
> library(psych)
> ICC(x=DF,lmer=FALSE)
Call: ICC(x = DF, lmer = FALSE)
Intraclass correlation coefficients
type ICC F df1 df2 p lower bound upper bound
Single_raters_absolute ICC1 0.36 2.1 9 10 0.13 -0.18 0.74
Single_random_raters ICC2 0.34 2.0 9 9 0.17 -0.26 0.74
Single_fixed_raters ICC3 0.32 2.0 9 9 0.17 -0.24 0.72
Average_raters_absolute ICC1k 0.53 2.1 9 10 0.13 -0.43 0.85
Average_random_raters ICC2k 0.51 2.0 9 9 0.17 -0.69 0.85
Average_fixed_raters ICC3k 0.49 2.0 9 9 0.17 -0.63 0.84
Number of subjects = 10 Number of Judges = 2
842:132人目の素数さん
20/04/03 23:40:27 MNrUuJMd.net
>>802
すいません
書き方が良くなかったです。
subject が1,2
judge a,b,c,dをきちんとfirst,second,third,fourth
と書くべきでした。
subjectとjudgeはあってると思うのです。
843:132人目の素数さん
20/04/03 23:42:39 MNrUuJMd.net
例えば
first second third fourth
0 0.05 0.1 0.15
0 0 0.05 0.05
0.15 0.1 0.05 0.1
0 0.05 0.2 0.05
0.1 0.15 0.1 0.05
0.15 0.05 0.1 0.05
というデータで
Call: ICC(x = over_sight)
Intraclass correlation coefficients
type ICC F df1 df2 p lower bound upper bound
Single_raters_absolute ICC1 0.0068 1 5 18
844:0.43 -0.19 0.48 Single_random_raters ICC2 0.0068 1 5 15 0.44 -0.19 0.48 Single_fixed_raters ICC3 0.0068 1 5 15 0.44 -0.19 0.48 Average_raters_absolute ICC1k 0.0268 1 5 18 0.43 -1.70 0.79 Average_random_raters ICC2k 0.0268 1 5 15 0.44 -1.82 0.79 Average_fixed_raters ICC3k 0.0268 1 5 15 0.44 -1.82 0.79 Number of subjects = 6 Number of Judges = 4
845:132人目の素数さん
20/04/03 23:44:30 MNrUuJMd.net
となるのですが、ICC1が0.0068ってこんなに低くなるのでしょうか?
結果のとり得る値が1~0なので最大15%ぐらいの変動幅で、
制度としてはかなりいい検査方法だとおもったのですが・・・
846:132人目の素数さん
20/04/04 00:07:42 npCU99bV.net
少し理解できました。
範囲制約性の問題があるのですね。
今回のサンプルがみんな低い得点で分散が低いからICCが低く算出されていました。
ダミーデータ
1,1,1,1
を追加したらICC=0.99となりました。
得点の高いサンプルを追加しないとICCで信頼性は測れないのですね。
847:132人目の素数さん
20/04/04 00:09:17 npCU99bV.net
いま有病者と健常者の両方を計測する検査法で健常者のみのデータでICCを算出しようとしているのが間違いということですね。
上記のような場合で、健常者のみでも信頼性を算出する方法っていうのはないのでしょうか?
848:132人目の素数さん
20/04/04 21:44:33 ZFu90Xbq.net
>>806
DF=rbind(
c(0,0.05,0.1,0.15),
c(0,0,0.05,0.05),
c(0.15,0.1,0.05,0.1),
c(0,0.05,0.2,0.05),
c(0.1,0.15,0.1,0.05),
c(0.15,0.05,0.1,0.05),
c(0.0001,0.0001,0.0001,0.0001))
とダミーに0.0001を加えても
> DF2ICC1(DF)
ICC(1,1) ICC(1,k)
0.2462707 0.5665262
> psych::ICC(DF)
type ICC F df1 df2 p lower bound
Single_raters_absolute ICC1 0.25 2.3 6 21 0.072 -0.027
Single_random_raters ICC2 0.25 2.3 6 18 0.079 -0.028
Single_fixed_raters ICC3 0.25 2.3 6 18 0.079 -0.034
Average_raters_absolute ICC1k 0.57 2.3 6 21 0.072 -0.115
Average_random_raters ICC2k 0.57 2.3 6 18 0.079 -0.122
Average_fixed_raters ICC3k 0.57 2.3 6 18 0.079 -0.154
となるから、高値データでなくてもいいみたい。
849:132人目の素数さん
20/04/24 21:32:48 1Teq2ITX.net
R 4.0.0 来た
850:132人目の素数さん
20/04/25 06:37:54.89 R/UD6QQG.net
SIGNIFICANT USER-VISIBLE CHANGES
URLリンク(cran.r-project.org)
851:132人目の素数さん
20/04/25 07:20:54 R/UD6QQG.net
パッケージを一括インストール
install.packages(available.packages()[,1])
852:132人目の素数さん
20/04/25 07:29:33 R/UD6QQG.net
>>811
これやってからでないとパッケージのコンパイルができない。
After installation is complete, you need to perform one more step to be able to compile R packages:
you need to put the location of the Rtools make utilities (bash, make, etc) on the PATH.
The easiest way to do so is create a text file .Renviron in your Documents folder which contains the following line:
PATH="${RTOOLS40_HOME}\usr\bin;${PATH}"
You can do this with a text editor, or you can even do it from R like so:
writeLines('PATH="${RTOOLS40_HOME}\\usr\\bin;${PATH}"', con = "~/.Renviron")
853:132人目の素数さん
20/04/25 08:56:31 R/UD6QQG.net
>>811
libraryのフォルダで dir /B とやって既にinstall済のリストを作って
install.packages("rstan","ggplot2",....)とやった方がいいな。
5000ほどパッケージがあるらしいけど、全部インストールしたらどれくらいの容量が必要なんだろう?
854:132人目の素数さん
20/04/25 12:31:15 uVYqRSBX.net
やってみてくれw
855:132人目の素数さん
20/04/26 21:05:35 tZeixXMR.net
>>813 これでいいかな?
targetPackages <- available.packages()[,"Package"]
newPackages <- targetPackages[!(targetPackages %in% installe
856:d.packages()[,"Package"])] install.packages(newPackages, repos = "http://cran.r-project.org")
857:132人目の素数さん
20/04/26 22:22:15 tZeixXMR.net
高血圧で不安だという老人の経過観察入院1件。発熱してなくてほっとした。
ステーキハウスがテイクアウトを始めたからインセンティブはその足しにしようっと。
858:132人目の素数さん
20/05/03 15:15:43 ICXX0aJG.net
>>814
コンパイルなしでやってみた。
サイズ:19.6 GB (21,082,530,395 バイト)
ディスク上のサイズ:20.3 GB (21,805,858,816 バイト)
ファイル数: 527,982、フォルダー数: 118,521
859:132人目の素数さん
20/05/03 15:37:44 f6MQMkc5.net
Ubuntu 20.04でRcmdrがビルドできないんですけど、これはソフトウェアが20.04に対応するまで待つしかないですか?
860:132人目の素数さん
20/05/03 20:21:16 l1OdZntk.net
>>818
自己解決しました。ライブラリの不足でした。
861:132人目の素数さん
20/05/04 17:06:14.69 HJhKUMfp.net
4.0でまたsjis関連の問題が出まくりそう
862:132人目の素数さん
20/05/07 01:08:38 VnQvkZ57.net
4.0になってから
col=番号指定での色が目に優しくなったみたい。
hist(runif(100),col=2)
hist(runif(100),col=rgb(1,0,0,1))
hist(runif(100),col='red')
863:132人目の素数さん
20/05/07 18:12:52.58 nLAcI1eZ.net
rgbで256色でそんなに変化ないんじゃない。
864:132人目の素数さん
20/05/07 19:16:11 VnQvkZ57.net
>>822
colours() と入力すると 657色から選べるから256以上ありそう。
865:132人目の素数さん
20/05/07 23:34:33 8IDmAqjy.net
4.0からパレット変えたんじゃなかったか?
866:132人目の素数さん
20/05/07 23:39:55 8IDmAqjy.net
リリースノートより
The palette() function has a new default set of colours (which are less saturated and have better accessibility properties).
There are also some new built-in palettes, which are listed by the new palette.pals() function.
These include the old default palette under the name "R3". Finally, the new palette.colors() function allows a subset of colours to be selected from any of the built-in palettes.
867:132人目の素数さん
20/05/07 23:46:21 8IDmAqjy.net
具体的な変更点はこのあたりを参照方
URLリンク(developer.r-project.org)
868:132人目の素数さん
20/05/08 00:23:14.39 CfFk/Uw1.net
binomにある信頼区間をグラフ表示させてみた。
binom.ci <- function(x,n,cl=0.95){
PEci=binom::binom.confint(x,n,conf.level=cl)
y=nrow(PEci):1
oldpar <- par(no.readonly = TRUE)
on.exit(par(oldpar))
par(mar=c(3,3,2,2))
par(oma=c(0,4,0,0))
plot(PEci$upper,y,xlim=c(min(PEci$lower),max(PEci$upper)),type="n",
yaxt="n",ylab="",xlab="Confidence Interval",
main=paste("C.I. for", x,"out of",n))
points(PEci$upper,y,pch="|") ; points(PEci$lower,y,pch="|")
segments(PEci$lower,y,PEci$upper,y,lwd=3,
col=sample(colours(),1))
abline(v=PEci$mean[1],lty=3)
axis(2, at=y, labels=PEci$method,as.vector,las=2,cex=0.75)
PEci
}
binom.ci(3,312)
869:132人目の素数さん
20/05/08 00:48:23 CfFk/Uw1.net
>>826
情報、ありがとうございます。
?paletteのヘルプにあるスクリプトを実行すると体感できました。
#
870:# Demonstrate the colors 1:8 in different palettes using a custom matplot() sinplot <- function(main=NULL) { x <- outer( seq(-pi, pi, length.out = 50), seq(0, pi, length.out = 8), function(x, y) sin(x - y) ) matplot(x, type = "l", lwd = 4, lty = 1, col = 1:8, ylab = "", main=main) } sinplot("default palette") palette("R3"); sinplot("R3") palette("Okabe-Ito"); sinplot("Okabe-Ito") palette("Tableau") ; sinplot("Tableau") palette("default") # reset
871:132人目の素数さん
20/05/09 20:51:55 oDT7bFgO.net
rjagsのコードに
theta[i,j] <- min(1, exp(-alpha[i]*t[j]) + beta[i])といいれて、確率を1以下にして二項分布させてようとすると
Node inconsistent with parents というエラーがでた。 stackoverflow.comも明確な答が見いだせず、あれこれいじって
どうも確率1や0で二項分布する可能性があるとエラーがでるみたい、というのを発見。
1を0.99999とするとエラーが回避できた。
1を 1 - 1e-16としてもエラー回避できた。
872:132人目の素数さん
20/05/18 08:52:51.27 s/hrJxRo.net
mathematicaは内部どうなってんだか知らないが第何種ベッセル関数とか入ってくるめちゃくちゃ重い積分を計算してくれた
873:132人目の素数さん
20/05/25 12:44:17 3k8+9x6G.net
"
ある人物Dが新型コロナ肺炎に罹患したとする。
行動調査によって発症前にキャバクラに行っており
接客したキャバ嬢Cが人物D発症の2日後に発症していたことがわかった。
キャバ嬢Cは人物Dから移されたと主張して1億円の賠償を求めている。
潜伏期間には幅がありキャバ嬢Cから移された可能性もあると主張して
その確率を計算して賠償金を値切りたい。
いくら値切れるか計算せよ。
"
潜伏期間が従う分布はこれ
#--- incubation period ---
# from Li et al NEJM 2020
# lognormal mean = 5.2
ln_par1 = 1.434065
ln_par2 = 0.6612
Gt <- function(delay){
C=rlnorm(1e6,ln_par1,ln_par2)
D=rlnorm(1e6,ln_par1,ln_par2)
mean(C-D > delay)
}
Gt(2)
874:132人目の素数さん
20/05/25 12:48:45 3k8+9x6G.net
怖い本で紹介されていたパッケージ polspline は秀逸。
発生させた乱数から確率密度関数を作ってくれる。
複雑な分布だと収束できず作れないこともあるけど
対数正規分布の差の分布を乱数発生させてpdfが作れた。
library(polspline)
delay=2
ln_par1 = 1.434065
ln_par2 = 0.6612
c=rlnorm(1e5,ln_par1,ln_par2)
d=rlnorm(1e5,ln_par1,ln_par2)
hist(c-d, freq=F,col='white',breaks=100,ylim=c(0,0.11),
xlim=c(-30,30),ann=F,axes=F) ; axis(1)
fit=logspline(c-d)
curve(dlogspline(x,fit),-30,30,ann=F,bty='n',add=T)
segments(delay,0,delay,dlogspline(delay,fit),pch=19,col=4)
curve(dlogspline(x,fit),delay,30,add=T,type='h',col=4)
curve(plogspline(x,fit),-30,30,lty=3,bty='n')
1-plogspline(delay,fit)
fn <- function(delay) 1- plogspline(delay,fit)
curve(fn(x),0,14, bty='n' ,xlab='Delay', ylab='Probability')
875:132人目の素数さん
20/06/01 16:49:09 smFiMdov.net
今気づいたけどdplyr 1.0.0がcranに来てた
876:132人目の素数さん
20/07/25 08:42:04 1FL39oBq.net
Rのグラフの出力をGIF動画にしたかったので検索したら、このページが役立った。
URLリンク(cse.naro.affrc.go.jp)
877:ezawa/r-tips/r/36.html mytest <- function() { ANS <- readline("1+2? ") if (ANS == "3") cat("Correct!\n") else cat("Wrong...\n") } mytest() mymessage <- function() { Sys.sleep(3) cat("Hello.\n") } mymessage() 尚、GIF作製には https://www.screentogif.com/ がお手軽だった。
878:132人目の素数さん
20/07/26 10:34:51 FqjSGBlb.net
他人のコードを読んでいたら、
'%&%' <- function(x,y) paste0(x,y)
という関数が定義されていた。
これは便利と思った。
> '√2 =' %&% sqrt(2) %&% ', π = ' %&% pi
[1] "√2 =1.4142135623731, π = 3.14159265358979"
879:132人目の素数さん
20/07/27 13:23:47 3h6isdRg.net
文字列をパイプでつないでいくのは面白いかも
880:132人目の素数さん
20/07/28 04:21:24 jhN+xo4C.net
'%.%' <- function(x,y) sum(x,y)
でベクトルの内積とかも
881:132人目の素数さん
20/07/28 04:22:11 jhN+xo4C.net
訂正
'%.%' <- function(x,y) sum(x*y)
882:132人目の素数さん
20/07/29 12:22:51 3HY+hEHZ.net
面白いけど使いどころが難しそう
%>%パイプとの親和性が無いのが痛い
883:132人目の素数さん
20/07/29 13:52:08 5tjjlndH.net
%文字%は二項演算子だから、定義次第じゃない?
884:132人目の素数さん
20/07/29 18:45:33 3HY+hEHZ.net
tidyverseや%>%を使わないならまあ
885:132人目の素数さん
20/07/30 18:02:20.97 8iPZt0Nw.net
>>835
それって意味があるの?
> paste0('√2 =', sqrt(2), ', π = ', pi)
[1] "√2 =1.4142135623731, π = 3.14159265358979"
普通にpaste0のまま使った方がタイプ量が圧倒的に少ないが。
886:132人目の素数さん
20/07/30 20:10:10 417El1m4.net
>>842
括弧の対応で混乱しそうなときにちょっと役にたつかも。
こんな感じ
eval(str2lang("expand.grid(" %&% paste0(rep("1:2",6),collapse=',') %&% ")"))
887:132人目の素数さん
20/07/31 07:51:08 0a0zx1wG.net
>>843
うーん、その例だとイマイチに思える
rerun(6, 1:2) %>% expand.grid
で済むものをわざわざ複雑にしているだけに感じる
888:132人目の素数さん
20/07/31 13:51:36.15 ImynyFWQ.net
>>844
無理やり、例示した感は否めないな。
標準装備でなら、
expand.grid(replicate(6,1:2,simplify = FALSE))
ですむし。
889:132人目の素数さん
20/07/31 23:36:09.03 0a0zx1wG.net
paste()やstr_c()以外を使うなら、sprintf()かglue::glue()が候補か
特にカンマが文字列に含まれるときにはpaste()より見やすくなるはず
sprintf("√2 = %s, π = %s", sqrt(2), pi)
glue("√2 = {sqrt(2)}, π = {pi}")
890:132人目の素数さん
20/08/01 18:51:48 2TFdzAyg.net
>>846
確かに便利ですね。
カンマを ','で入力するのは混乱のもとでしたから。
有用な情報、ありがとうございます。'
> glue::glue("√2 = {sqrt(2)}, sin(π/3) = {sin(pi/3)}")
√2 = 1.4142135623731, sin(π/3) = 0.866025403784439
891:132人目の素数さん
20/08/06 00:01:24 rivMs4GJ.net
初心者質問で申し訳ありません。
ある関数を作りたいのですが、その関数に入れる数値の数はランダムな場合はどのように書けばいいのでしょうか。
例えば、入れた要素をすべて掛け合わせる関数が作りたい場合、そこに入れる要素が(2,3,4)でも、(2,3,4,5,6)でも反応するような関数の
892:書き方を教えてくださると助かります。
893:132人目の素数さん
20/08/06 00:05:38 ID3ryEgK.net
ベクトルで渡せばいいのでは?
そういう話じゃない?
894:132人目の素数さん
20/08/06 01:18:04 rivMs4GJ.net
874さん。
847さん、回答ありがとうございます。
確かにベクトルで何かするのはわかるのですが、その部分がわからないのです。
出来れば下に問題を書くので、コードを書いていただけると非常に助かります。
問、正の整数であるベクトルを入力すると、そのベクトルの要素をすべて掛け合わせた値を結果として返す関数を作りなさい。
895:132人目の素数さん
20/08/06 02:03:47 V+bu3PeG.net
>>850
問題文これだけ?他に条件はないの?
標準の関数にあるけどいいのかな?
関数fを作るとして、一番いいのは標準の関数に余計な変更を加えないことだから、これが答えだけど…
f <- prod
896:132人目の素数さん
20/08/06 02:11:09 rivMs4GJ.net
849さん、返信ありがとうございます。
実は問2がありまして、たぶんそれは既存の関数にはないと思うので、そちらも教えていただけると非常に助かります。
問2、要素がすべて整数であるベクトルを入力すると、そのベクトルの要素の絶対値をすべて掛け合わせた値を結果として返す関数を作成せよ。
897:132人目の素数さん
20/08/06 05:13:12 03BiGX3I.net
>>852
f = function (x) abs(prod(x))
898:132人目の素数さん
20/08/06 05:15:08 03BiGX3I.net
>>851
while やfor もしくは再帰関数を使って作らせる問題かな?
899:132人目の素数さん
20/08/06 05:27:00.71 meNNWVIo.net
>>848
f <- function(...){
v=c(...)
ans=1
for(i in v) ans=ans*i
ans
}
> f(2,3,4)
[1] 24
> f(2,3,4,5,6)
[1] 720
900:132人目の素数さん
20/08/06 05:32:55.68 meNNWVIo.net
>>852
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
901:132人目の素数さん
20/08/06 05:34:50.08 meNNWVIo.net
>>852
入力はベクトルだったから、
> 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
902:132人目の素数さん
20/08/06 06:04:14.18 meNNWVIo.net
再帰だとこんな感じかな?
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
903:132人目の素数さん
20/08/06 06:35:53 eFxPvNIl.net
みんなアタマいいなぁ…
904:132人目の素数さん
20/08/06 08:34:19 E/ufUouA.net
>>859
854, 855, 856を真似るなよ。
905:132人目の素数さん
20/08/06 08:49:09 E/ufUouA.net
再帰版はこんな感じかな。
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])
}
906:132人目の素数さん
20/08/06 11:42:21 rivMs4GJ.net
質問者本人です。
皆様のお力添えのおかげで無事問題を解くことができました。
初心者質問にやさしく回答して頂いて感謝しかありません。
本当にありがとうございました。
907:132人目の素数さん
20/08/06 19:28:54.17 meNNWVIo.net
>>861
この方が>858みたいに関数の中で関数を定義とかなくてカッコいいと思ったので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
908:132人目の素数さん
20/08/06 20:06:06 meNNWVIo.net
比較のために、関数名の�
909:キさを同じにして、時間のかかる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
910:132人目の素数さん
20/08/06 20:31:17.99 E/ufUouA.net
それはね、856は厳密な意味での再帰ではないから速いしリ、ソースを食わないんだよ。ループを再帰風に書いただけだから。それよりもループのほうが速いに決まっている。
この問題を再帰で解くのはムダ以外の何ものでもない。
911:132人目の素数さん
20/08/06 20:33:25.51 w8yiRRv5.net
>>865
喩えれば、
親分が子分を再帰で酷使しているだけだから親分は消耗しない
という理解でいい?
912:132人目の素数さん
20/08/06 20:47:18.11 E/ufUouA.net
全然違う。
再帰は、複雑な問題をより小さい問題に分割することがキモだ。
856は元のベクトルはそのまま変わらずに存在していて、ある特定の要素を一つずつ処理しているからループとやってることは変わりない。
859は、一つ短いベクトルを自分自身に処理させているから真の再帰なのだ。
913:132人目の素数さん
20/08/06 22:25:29 meNNWVIo.net
>>867
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
914:132人目の素数さん
20/08/06 22:50:49 XP8VEZbb.net
>>867
(ご入力訂正)
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
915:132人目の素数さん
20/08/07 21:08:59 S7qsZ31k.net
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])
}
916:132人目の素数さん
20/08/08 05:40:19.06 2ggSSq05.net
>>870
勉強になりました。
ついでにwhile版を書いてみました。
f <- function(x){
ans=1
while(length(x)){
ans=ans*abs(x[1])
x=x[-1]
}
ans
}
917:132人目の素数さん
20/08/08 09:18:18 FvlAeRBY.net
>>870
859が遅い根本の原因は、x[-1] が生成されること。
他の指摘は、細かい高速化の工夫だから初心者に薦めるのはどうかと。
現に869で全く実用的に意味のないコードを書いているし。
題意を素直に表したほうがよいのでは?
絶対値の積は、積の絶対値と等しいから、absを呼ぶのは1回で済むが、何も説明無しにそうするのは私的にはアウトだ。メンテナンスの時に自分や他人が苦しむから。
918:132人目の素数さん
20/08/08 11:01:30 559rm1Tc.net
>>872
意味不明なこと言いだしてるが大丈夫か、落ち着け
859は、無駄な条件分岐あるし、すぐオーバーフローするし、コードが冗長だしで、それこそ初心者以外にもNGだぞ
絶対値の積うんぬんに関しては、859と同じでabsを毎回呼んでる、余計な代入操作が無いだけだ
落ち着いてコードを見ろ
速度うんぬんの話はこれまで話題に出てきたように、856と比べての話だ、話についてこれないなら無理に入ってこなくていい
別に高速化を目的としてるわけじゃなく、859から冗長な部分やオーバーフローの原因を取り除いた結果高速化されたってだけだ
だが、速度が遅い原因がxl.aへの代入でなく、x[-1]作成が原因てのはそのとおりだ
文章を書いてる途中で、オーバーフローの原因(代入操作はこっちだ)と勘違いしてしまったようだ
これは訂正に感謝だ
919:132人目の素数さん
20/08/08 11:24:32 FvlAeRBY.net
>>873
おまえこそもちつけ。
再帰は、再帰の停止条件と、自分自身が行う作業に分離できる。
この場合の停止条件は、要素が1つになったときと考えるのが自然だろう。
数学的には要素が0でもよいし、Rの場合はそれでうまくいくから問題はない。だが、そういった詳細を何も説明せずにこれでよい、と示すのはどうかな?
あと、絶対値を取ったのを代入しているのは、この作業が複雑になった場合の修正の確実さを優先するためで、優秀なバイトコンパイラであれば速度の差はなくなる。
920:132人目の素数さん
20/08/08 23:06:27.95 UlZ+DmHh.net
一人だけエラー吐いて、まともに動かない関数書いた無能が、
それでも、恥ずかしげもなく、一生懸命マウント取ろうとあがく姿は、
滑稽で哀れになってくるわ
921:132人目の素数さん
20/08/13 17:34:36 5b54QocS.net
>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
>
とエラーがでないなぁ。
何故だろう?
922:132人目の素数さん
20/08/20 13:26:56 mPUCNi08.net
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)
923:132人目の素数さん
20/09/09 22:54:07 IR7822fG.net
ありがとうございます
924:132人目の素数さん
20/10/19 07:15:12.45 21zikI9w.net
PならばQ をパイプで P %=>% Q として論理演算で遊んでみた。
"
問題 : 「シリツ医 ならば (馬鹿 ならば 裏口 である)」という命題と同値な命題はどれか?
1 : シリツ医 ならば (裏口 ならば 馬鹿 である)
2 : 馬鹿 ならば (シリツ医 ならば 裏口 である)
3 : 馬鹿 ならば (裏口 ならば シリツ医 である)
4 : 裏口 ならば (シリツ医 ならば 馬鹿 である)
5 : 裏口 ならば (馬鹿 ならば シリツ医 である)
"
# PならばQ ≡ (P かつ (Qでない))ではない
'%=>%' = function(P,Q) !(P & !Q)
# premise
A = function(S,
925: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]))
926:132人目の素数さん
20/10/19 07:15:28.30 21zikI9w.net
# 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]))
927:132人目の素数さん
20/11/17 19:55:57.27 UJMPy762.net
,で文字列を分けようとしたらうまくいかなかったが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"
928:132人目の素数さん
20/11/17 20:18:32.66 /TSutyYc.net
unlist(strsplit("3.14", "¥¥."))
人に見てもらいたかったら読みやすく書けよ。アンタのプログラムはいつも読みにくい。
929:132人目の素数さん
20/11/18 01:42:18.74 CJUGi+QQ.net
>>882
備忘録として書いたのでレスがつくとは思ってなかったが、レスthanx.
930:132人目の素数さん
20/12/10 02:17:40.15 Whv7aYu3.net
数値積分をさせていたら
初めてみるこんなエラーが返ってきた。
roundoff error is detected in the extrapolation table
困ったときのstackoverflow.comで
URLリンク(stackoverflow.com)
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
とするとエラーなしに計算してくれた。
(備忘録)
931:132人目の素数さん
20/12/12 23:25:15.53 DvLXeu4z.net
それエラーが出るべきなのに出ない誤りなんじゃ、って可能性はないの?
932:132人目の素数さん
20/12/13 08:12:33.91 xmsEH+j9.net
>>885
別スレの問題を「プログラムで面積を数値計算させていたらエラー発生
体験したければ読みにいコードの下記をどうぞ。
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の方程式
GRE
933:EN=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)
934:132人目の素数さん
20/12/13 08:15:08.06 xmsEH+j9.net
入力の省力化にこんな関数を道具箱に詰めた
# 定積分
integral <- function(fn,lwr,upr,...){
cubature::cubintegrate(fn,lwr,upr,method='pcubature',...)$integral
}
935:132人目の素数さん
20/12/13 09:32:37.11 xmsEH+j9.net
>>886
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)
こっちはエラーがでない。
936:132人目の素数さん
20/12/21 20:43:26.34 gcvC1Sv7.net
func <- function (...) {
return(anova(...))
}
func(fit1, fit2, fit3)
オブジェクトの引数をうけとって、関数内の関数anovaに渡して
ちゃんと動かすにはどうしたらいいですか?
937:132人目の素数さん
20/12/23 07:21:19.77 N7Fbsys3.net
>>889
>775みたいに
c(...)もしくはlist(...)で引き出すのでは動作しない?
938:132人目の素数さん
20/12/23 11:45:33.99 DPeLDm1M.net
>>889
> 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
ちゃんと動くけど。
何がどう問題なのかを明確にして質問しないと助言を得られないよ。
939:132人目の素数さん
21/01/03 22:00:14.73 8tLYm46h.net
やっぱり、パッケージになっている関数は高速だな。
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
940:132人目の素数さん
21/01/21 00:00:54.88 KZXQ/VTY.net
時刻と、その時に従業員がいた場所(住所)がデータとして一覧化されていて、
いつ、どこによくいるかをクラスタリングしたいのですがRは出来るのでしょうか?
941:132人目の素数さん
21/01/24 12:08:49.15 oqt0Qph1.net
>>893
SpaTimeClusパッケージ
942:132人目の素数さん
21/02/14 11:56:55.00 g9kE6hlo.net
IPB size
1 I 82571
2 B 4909
3 B 230
4 B 231
こんな感じのデータフレームを複数ファイルを読み込んで
ファイル別に横につなげる場合どのようにfor文を書けばいいですか?
943:132人目の素数さん
21/02/14 12:28:29.31 n5qxzAHa.net
purrrパッケージを使った方が速いんじゃね?
944:132人目の素数さん
21/02/14 16:02:48.85 g9kE6hlo.net
> 894
ありがとう。これで無事横並べられた
URLリンク(gist.github.com)
945:132人目の素数さん
21/03/16 13:05:28.85 cJpJJpsg.net
# 振幅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
もっとエレガントなコードがあればご教示をお願いします。
946:132人目の素数さん
21/03/18 08:46:13.56 IPPbuENC.net
時系列データ成型の解説でいいサイトないですか
947:132人目の素数さん
21/03/31 01:41:06.70 Cwg7NuDW.net
>>898
コードのことならプログラム板のほうで訊いたほうがよさそう
948:132人目の素数さん
21/06/05 21:13:05.02 5b0TiKZo.net
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
詳細は
URLリンク(cran.r-project.org)
で
949:132人目の素数さん
21/06/06 12:41:44.43 X+DUyz8T.net
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)
950:132人目の素数さん
21/06/06 12:54:15.47 X+DUyz8T.net
|> 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円を描画
951:132人目の素数さん
21/06/06 22:14:15.22 X+DUyz8T.net
パイプで速度が落ちるかと思ったけど変わらないね。
> (\(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
952:132人目の素数さん
21/06/06 22:37:59.70 jjPG368x.net
そのパイプを使ったコードをquote関数に噛ませば分かるけど実際はパーサーが下のコードに変換してるだけらしい。
なので実態としては演算子や関数ではないのでオーバーヘッドが生じないとのこと。
953:132人目の素数さん
21/06/08 05:41:54.05 uSV089kB.net
>>905
レスありがとうございます。早速、やってみました。
> quote((\(n) sample(10,n, replace = TRUE) |> unique() |> sort()) |> Vectorize())
Vectorize((function(n) sort(unique(sample(10, n, replace = TRUE)))))
954:132人目の素数さん
21/06/08 06:02:44.83 uSV089kB.net
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
955:132人目の素数さん
21/06/08 06:10:22.55 uSV089kB.net
パイプで送る関数に引数が1個なら自分でパイプを定義するのと変わらないなぁ。
オンラインで実行できるサイトだと必ずしも最新版のRに対応していないし、外部ライブラリ非対応のところもあるので
自分でパイプを定義の方がいいかも
'%|%' <- function(x,FUN) FUN(x)
> sample(10,10,replace=TRUE) %|% sort %|% unique
[1] 1 3 5 6 7
956:132人目の素数さん
21/08/29 23:23:03.95 OFN46wh5.net
# 備忘録
hogehoge <- function(x){
cat(deparse(substitute(x)),'=',x,'\n')
}
ch='Swiss'
hogehoge(ch)
> hogehoge(ch)
ch = Swiss
957:132人目の素数さん
21/11/05 22:47:20.72 lTyg7nhh.net
これ↓、思ったように動かないけど、普通?
iris[any(iris[,3]==c(6.1,5.1)) ,]
いまいちR言語の仕様がわからん。
958:132人目の素数さん
21/11/05 23:38:14.16 I43ryX9p.net
何をしたいのか説明できない理系脳かな?
適当に推測するに、
iris[iris[, 3] %in% c(6.1, 5.1), ]
959:132人目の素数さん
21/11/06 21:41:29.28 8hjJFETA.net
ありがとう。
雰囲気で伝わるかなと思った。
960:132人目の素数さん
21/11/06 21:45:56.76 8hjJFETA.net
SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
Rの有利な点は表を容易に分割→編集→結合できる点で、Accessの有利な点はクエリを何段にも重ねることで表を視覚的に扱えることだと思うんだけど、どうかな?
要約すると、細かいとこに手が届くのと、そうではないけど直感的なところ。
961:132人目の素数さん
21/11/06 21:53:39.63 8hjJFETA.net
SQLがAccessの例に限定されちゃってるね。
でも同じように文字で書くなら、Rの方が便利に思えるな。
Officeが使える環境でR使ってるから、Rだけの環境に移行すればどんな不便が発生するか検討中なんだけど、どう思う?
962:132人目の素数さん
21/11/08 19:14:28.35 xqrS4yV9.net
>>913
> SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
何を言っているのか分からないが、用意されいている分析手法の豊富さが全く違うだろ。
例えば、多重検定の検定法とかSQLにあるの?ノンパラメトリックの多重検定とかちゃんとできるの?
963:132人目の素数さん
21/11/08 19:14:46.14 xqrS4yV9.net
>>913
> SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
何を言っているのか分からないが、用意されいている分析手法の豊富さが全く違うだろ。
例えば、多重検定の検定法とかSQLにあるの?ノンパラメトリックの多重検定とかちゃんとできるの?
964:132人目の素数さん
21/11/09 20:40:06.49 hGmtIAbe.net
そうだよね。
組み合わせて使うもんだよね。SQLとRは。
ただ、境界線をどこで引くべきか微妙なところで悩む。RだとRStudioのレポートとして残せるから、分析手順を残していくことを考えると極力R使った方がいいのかな。
965:132人目の素数さん
21/12/04 13:16:48.05 3GLpEIlX.net
いや、SQLとRは全くの別物だろ
SQLはデータベースのマネジメントシステムで、
Rはデータ分析のツールじゃん
966:132人目の素数さん
21/12/04 14:11:32.93 0kKQqVbM.net
別物だから組み合わせて使う意味がある
967:132人目の素数さん
21/12/04 20:41:11.61 fCvhwSlW.net
いや、SQLとRは全くの別物だろ
組み合わせて使う意味はない
968:132人目の素数さん
21/12/04 22:13:49.92 6B5EP1qJ.net
そうだな、お前は使わなくていい
絶対に使うな
969:132人目の素数さん
21/12/04 22:16:19.95 sikGs8rn.net
別物だから別々に使う意味がある
970:132人目の素数さん
22/02/28 07:22:18.49 A7JZ2ass.net
URLリンク(twitter.com)
を実行出来た方いますか?
(deleted an unsolicited ad)
971:sage
22/02/28 12:38:08.27 dt49D0nX.net
URLリンク(detail.chiebukuro.yahoo.co.jp)
で解決しました。
スレを汚してすみませんせした。
972:132人目の素数さん
22/03/02 03:27:08.75 RV9q7yNr.net
今更レスだけどなんでaccessと比べるのか、ex
973:celじゃねーの excelは商用だけあって機能的には検定回帰成分分析因子分析何でもできてRに劣るところは無いし、統計以外なら最適化が強い Rより遅いしVBAは醜いし、365なんていきなり環境ぶっ壊されかねないからRに安住するけど
974:132人目の素数さん
22/03/02 03:30:48.43 RV9q7yNr.net
インタラクティブに使う分にはCSE使えるexcelの方が便利だな
ぜひともRに取り入れたい機能の一つ
975:132人目の素数さん
22/03/02 03:42:31.09 RV9q7yNr.net
excelで巨大データ扱うにはaccessインテグレーション機能で補完し合うといいとは聞くけど、俺のアカデミック割のofficeではaccessはハブられてた悲しみ
976:132人目の素数さん
22/03/06 16:53:40.50 BGFbnw+F.net
精度が怪しいだけ
977:132人目の素数さん
22/03/06 16:55:06.71 BGFbnw+F.net
コマンドで操作しづらい
978:132人目の素数さん
22/03/18 15:05:36.24 Z+B2NJF6.net
contourのzlimはどう設定すればよいのでしょうか?
URLリンク(navaclass.com)で
ユークリッド距離の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で等高線が変化するようです。
これでは新たな相関係数を使ったときにどう設定すればよいのか分かりません。
どうか教えて下さい。
979:132人目の素数さん
22/03/18 15:25:12.51 3f0eXSLb.net
>>930
xlim, ylimは指定した値でスパッと切るわけではないので(前後に余裕を持たせるようになっている)、
zlimも同じ仕様だと想像するよ。
xlimやylimで指定した特定の値でスパッと切るオプションがあったと思うので、
zlimにも有効でないかどうか、そこから調べて見れば?
980:132人目の素数さん
22/03/18 17:48:09.58 Z+B2NJF6.net
>>931
ありがとうございます。
今、いろいろ計算した結果、等高線の位置自体は正しいことが判りました。
ただ、問題は等高線の刻みが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"だと無くなりました。
981:132人目の素数さん
22/03/18 18:10:24.04 Z+B2NJF6.net
すみません、labels=“”になっているというオチでした。
とりあえず、これで問題ないか確認します。
982:132人目の素数さん
22/03/21 13:18:24.75 k7XqFrKG.net
ご助力をいただきたく、質問いたします。
対象データ
データフレームA内のB列, <chr>型 中身は例として 文字列で"2022/02/24"が入っている。
やりたいこと
この文字列をRのDate型に変換したい
やってみたこと。
tidyverseを用いて
A %>% select(B) %>% as.Date()
これだとエラーが出ました。
エラー文は「'.'からクラス"Date"へ変換はできません」
どうやったらこのB列をRのDate型に変換できますでしょうか。
983:132人目の素数さん
22/03/21 15:20:29.09 SKGsv+wa.net
>>934
パイプ処理したいならlubridateパッケージが便利です。チートシート(英語)が公開されているので、使い方は確認してみてください。
パッケージ名のスペル間違ってたらごめん。
984:132人目の素数さん
22/03/21 17:46:23.39 qn67+d1x.net
>>934
変換できない理由は、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()関数を使う必要が
あります。
985:132人目の素数さん
22/03/21 20:28:10.47 k7XqFrKG.net
>935様
>936様
ご教示ありがとうございます。
参考にまずは試してみます。
986:132人目の素数さん
22/03/22 07:49:54.09 kcYWMWlK.net
>>934
selectじゃなくてpullにすれば動くよ
987:132人目の素数さん
22/03/22 12:12:27.45 CNKDZNvw.net
pull()は知らなかったけど引数を二つ指定するとnamed vectorも作れるんだな。
988:132人目の素数さん
22/03/25 19:24:11.66 YaAd0nW/.net
借金を返す手段は大増か
踏み倒し(=ハイパーインフレ)の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がとてつもない数で姿を表すでしょう
(deleted an unsolicited ad)
989:132人目の素数さん
22/03/27 21:47:05.79 nv2FRWMk.net
質問いたします。よろしくお願いいたします。
ベクトル
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つのベクトル(行数同じとしても)には作用できないのですね?
990:132人目の素数さん
22/03/27 21:55:41.37 C7ecChkw.net
>>941
何をどうしたいのか、具体的に書いてくれ。
何がしたいのか、さっぱりわからん。
c(1, 2, 3, 3, 5, 5, 7) を 1:7 にしたいだけなら、seq(along=a) でよいが、前と同じ値の場合は、前の値に1を足すというのであれば、rle を使えばなんとかなりそう。
991:132人目の素数さん
22/03/27 22:01:16.21 BmY4vlnd.net
質問が下手だと答えてもらえないぞ。
992:132人目の素数さん
22/03/27 22:03:58.44 nv2FRWMk.net
>>942
すいませんでした。詳しく書くと、
cベクトルにはcsvから読み込んだ、時間データの秒数が整数値で入っています。
(・csvデータには他に、時間データの年、月、日、時、分、秒、と
全て整数値がそれぞれ別の列で入っています。
・このcsvデータは1秒サンプリングです。
ただそのデータは秒がたまに重複しているのです。
重複している時のルールとして、直前の、1秒前の時間の秒が秒列に入っています。
例で挙げたように
1, 2, 3, 3, 5, 5, 7, 8, 9, 9
この重複を訂正したいのです。
そこで考えたのが 939で挙げたスクリプトだったのですが、
あまりにも遅く(1日分のデータ24*60*60行を訂正するのに)
質問いたしました。
993:132人目の素数さん
22/03/27 22:13:43.93 UiNoGcwm.net
おれもさっぱり質問の意図が理解できないが、重複除去なら集合演算の
b <- unique(a)
でbは
> b
[1] 1 2 3 5 7
になるよ。
994:939
22/03/27 22:17:25.42 nv2FRWMk.net
>>945
回答ありがとうございます。わかりづらくてすいません。
重複除去ではなく、重複のです。
942に書いたように、
秒データが
1,2,3,4,5,6,7,8
とあるべきところが
1,2,3,3,5,5,7,8
のように4秒のところが直前の3秒に、6秒のところが直前の5秒になっています。
これを修正したいのです。
995:132人目の素数さん
22/03/27 22:24:40.36 BmY4vlnd.net
そういうことか。
なら
a <- 1:8
で置換しちゃえばいいんじやないの?
てかまず国語を勉強しよう。
996:939
22/03/27 22:30:24.14 nv2FRWMk.net
>>947
ありがとうございます。
確かに国語力ないですね、今から考えると、、、
必要な前提を書ききれていません。
さらに必要な前提は、データが24*60*60秒分全部なく、1、2秒分抜けているのです。
997:132人目の素数さん
22/03/27 22:34:34.62 C7ecChkw.net
例が悪いね。
本当に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)
これでできると思うが、これで遅いなら、重複のところだけを修正するようにすればよい。
998:132人目の素数さん
22/03/27 22:35:09.61 UiNoGcwm.net
反省ゼロだなw
999:132人目の素数さん
22/03/27 22:37:05.89 BmY4vlnd.net
確認だけど、重複してる場合は必ず2つで、3つ以上はないの?
1000:939
22/03/27 22:38:26.76 nv2FRWMk.net
>>949
ありがとうございます。
参考に考えてみます。
>>950
返す返す申し訳ないです、、
1001:939
22/03/27 22:41:51.48 nv2FRWMk.net
>>951 データの特徴は、 1。重複は2つ。 2。データの抜けは想定できない。 1日に5分ほどのこともあれば(付け加えて言うと、1日のデータをファイルに保存している) 1日に1から3秒ほどの時もあります。(この時は、1日のデータをファイルに保存していない時)
1003:132人目の素数さん
22/03/27 22:42:10.78 UiNoGcwm.net
ヘタに抽象化せずに
隠さずに具体例を挙げて
FromとToを書けば無駄なやり取りをせずにすむ。
1004:132人目の素数さん
22/03/27 22:43:35.30 UiNoGcwm.net
>>953
そういうのが「ヘタな抽象化」です。
1005:132人目の素数さん
22/03/27 22:47:45.39 colv4Rae.net
まあ、落ち着け。時間データをクレンジングしたいんだとは思うけどもう少し元データについて整理しなされ。
1006:939
22/03/27 22:57:08.96 nv2FRWMk.net
>>955
>>956
ありがとうございます。
データが多いので、下手に抽象化してしまいましたが、
今手元のデータ例では、19:15:26のデータから秒列だけ上げると
下記のように19:15:36から秒列が重複することを始めます。
これが終了するのはデータによりけりで不明です。
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45
1007:132人目の素数さん
22/03/27 22:58:55.54 UiNoGcwm.net
おれはもう脱落する。これは無理だ。
1008:132人目の素数さん
22/03/28 00:36:05.49 wfEbVN/P.net
これなら、修正箇所が少なくても多くてもパフォーマンスは変わらないはず。
comp.before <- function(x) {
# x の NA を直前の値で補完する.
valid <- !is.na(x) # NA でない(有効な)場所
v <- x[valid] # 有効な値
n <- diff(c(which(valid), length(x)+1)) # それを繰り返す回数
rep(v, n)
}
a <- c(1, 2, 2, 2, 9, 9, 11)
s <- seq(along=a) # 1から始まる等差数列
d <- ifelse(c(FALSE, diff(a) == 0), NA, s - a) # s から a の正しい部分を復元するための差
res <- s - comp.before(d) # 重複部分を修正するには、正しい部分の d を引き継げばよい
1009:132人目の素数さん
22/03/28 01:12:01.08 srY6abow.net
>>957
寝る前だったので、秒の部分だけでサンプルデータコードにしているので、そこは、
適宜、実際のデータに合わせて修正して。
library(tidyverse)
data.frame(
time = c(26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45)
) %>%
dplyr::mutate(diff = time - dplyr::lag(time, default = 0)) %>%
dplyr::mutate(new = dplyr::if_else(diff == 0, time + 1, time))
データ重複が2連続だけというのが前提です。3連続以上の場合は、最後の行の
処理を参考に追加してみてください。
1010:939
22/03/28 11:11:48.47 H+9Gp8uW.net
>>960
ありがとうございます。
なるほど、if_elseをそのように使うのですね。
条件の中で二つのベクトルを使ってダメだったので、諦めてました。
勉強になりました!!
1011:132人目の素数さん
22/03/28 11:56:48.44 srY6abow.net
>>961
lag()関数のdefault引数の指定があまりよくないので、
こちらの方が良いでしょう。処理手順を分かりやすく
するために処理を分割しています。
ただし、元データに欠損値(NA)がある場合は、意図した
結果を得られない場合がある点には注意してください。
data.frame(
time = c(26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45)
) %>%
dplyr::mutate(lag = dplyr::lag(time)) %>%
dplyr::mutate(diff = time - lag) %>%
dplyr::mutate(new = dplyr::case_when(diff == 0 ~ time + 1,
diff != 0 ~ time,
is.na(diff) ~ time))
1012:939
22/03/28 12:17:31.10 H+9Gp8uW.net
>>962
なるほど、さらにありがとうございます。
case_whenやis.na関数を使って、例外処理をなさっているのですね。
非常に勉強になりました。
確かに私があげていたlag関数でのdefault設定だと例外だというのが後で見てわかりづらいですね。
ありがとうございました!!
1013:132人目の素数さん
22/03/28 13:56:21.89 3UL2KL2b.net
分をまたいでずれたり稀に日付をまたいでずれたりはしないのかな
1014:939
22/03/28 14:04:18.16 6B8xjzPg.net
>>964
すいません、前提をいろいろ省略していて、、、
そこは条件文の重ね書きか、modをつかって解決しようとかんがえてました
1015:132人目の素数さん
22/03/28 17:02:57.35 srY6abow.net
日付も含んだ日時情報として記録されている、もしくは、正しい日付を補完できる
のであれば、POSIXタイムで処理すれば分またぎも日またぎも対応できるかと。
2022/2/28 23:59:58
2022/2/28 23:59:59
2022/2/28 23:59:59
2022/3/1 00:00:01
2022/3/1 00:00:02
こんな感じのデータでも3行目を「3/1 00:00:00」に修正できるかと。
データが飛んでたりするなら>>959さんの処理を応用すれば良いかと。
1016:939
22/03/28 19:37:40.90 H+9Gp8uW.net
>>966
そこは正直迷いました、タイムデータを作るのが先か、秒を修正するのが先か。
まずは、秒修正を先にしたのが、Rでのタイムデータの操作と数値データ操作が
どっちが早いかわからなかったので、まずはとっつきやすい数値データを修正して時間データにすることにしたのです。
>>959
礼を述べるのが遅れてすいません。
データが飛んでるところを修正するのに使用いたします。ありがとうございます!!
1017:132人目の素数さん
22/03/31 14:09:36.00 MFVXsplM.net
こちらでrstanarm のパッケージを使っている方はいらっしゃいますでしょうか?
rstanarm のstan_glm関数を使って簡単な回帰式の練習をしています。
シグマの事前分布として
prior_aux = exponential(0.0008) を設定したいのですが、
Error: '8e-04' is not a supported link for family 'exponential'.(以下略)
というエラーメッセージが出て止まってしまいます。
引数を(autoscale = TRUE) と変えてみても、
Error in exponential(autoscale = TRUE) :
unused argument (autoscale = TRUE)
が出て止まってしまいますので、どうも()内を認識してくれないようです。
もし対処の方法をご存じの方がおられましたら、ご教示いただければ
ありがたく存じます。
1018:132人目の素数さん
22/03/31 23:46:22.65 YJpZ/tmn.net
>>968
exponentialがrstanarmからじゃなくて他のパッケージから呼び出されてるとか?
試しにrstanarm::exponential(0.0008)で試してみては?
1019:132人目の素数さん
22/04/01 00:14:55.42 zUpPvDgR.net
ホントは一両日日跨ぎデータはスピノール的な情報として扱わないと
西から出たおひさまが東に沈む
地球の回転に逆らって高速飛行した時の不具合が出てくる。
1020:132人目の素数さん
22/04/01 00:16:31.25 zUpPvDgR.net
地球一周航海して暦が一日ズレるマゼラン以降の話でもある。
多分ガウスは勘付いてたっぽい。
1021:132人目の素数さん
22/04/01 05:42:17.81 kP8tAwPH.net
>>969
966です。早速ご教示いただきまして、どうもありがとうございました。
ご指摘の通りでした。おかげさまで大変勉強になりました。
重ねて厚く御礼申し上げます。
1022:132人目の素数さん
22/04/06 00:13:06.16 0iZ26VyL.net
POSIXctを使った文字列からの日時時刻表現への変換について教えてください。
あるcsvでうまくいったスクリプトが、別のスクリプトではうまくいってないのです。
いま、下記のようなtest1.csvがあり、
time
2022/4/4 19:19:10
2022/4/4 19:19:11
下記のスクリプトを通して読み込み、整形しました。
files<-dir(pattern="test1", "./")
tmp <- do.all(bind, lapply(files, function(x) read.csv(x, h
1023:eader=TRUE, stringsAsFactors=FALSE))) newDate <-as.POSIXct(tmp[,1]) この時、 typeof[,1]は"character"となり、 newDate[1]は、"2022-04-04 19:19:10 JST"となります。 ところが、本番で別の(複数の)csvを読み込ませると、 typeof[,1]は"character"となるのですが、 newDate[1]は、"2022-04-04 JST"となり時刻が消えます。 最初にうまくいったtest1.csvの時刻データが 上記の別のcsvの時刻データをコピーして作ったにもかかわらずです。 何か考えられる原因、解決策はないでしょうか。 a <- c("2022-04-04 23:42:10")
1024:132人目の素数さん
22/04/06 00:34:29.13 b2LBb0Tv.net
0:00:00だと時刻が消える。
2つ以上 print してみたら?
1025:132人目の素数さん
22/04/06 00:37:00.36 b2LBb0Tv.net
あくまでも print の仕様であって、中身は問題ないはず。as.numeric してみると1秒ごとに1増えるのがわかるはず。
1026:971
22/04/07 14:27:54.56 IW6MEgzS.net
ご回答ありがとうございます。
それが、as.numericしても値がかわってないのです。なので困惑してます。
1027:132人目の素数さん
22/04/07 16:08:34.71 C76YhwBc.net
>>976
では、現象が再現する最小のコードとデータを出してください。
1028:132人目の素数さん
22/04/07 18:50:20.45 Z4m29Esd.net
>>973
きちんと時刻まで入ってないcsvか不正な時刻のcsvが紛れてる
1029:971
22/04/07 22:25:10.05 pOGo0jeY.net
>>978
それでした!!
newDate <-as.POSIXct(tmp[,1])
を
library(lubridate)
newDate<-ymd_hms(tmp[,1],tz="Japan")
で変換したところ、ほぼ全てのデータが時刻まで表示されるようになったのですが、
ごく数個、parse errorとなり、NAに変換されてました。
かくにんすると、元データが、"00:00:00"の時だけ、日付になってました。
助かりました。ありがとうございました。
1030:132人目の素数さん
22/04/17 16:45:16.53 2Fhpn5bu.net
(質問)
データフレーム内で、数値データに文字列'error'が混入しているとき、
どうやって値を、直前の値に変換したらよろしいでしょうか。
(例)
test <- c(1,2,1,4,'error',8,9,8,'error','error','error',1)
df <- data.frame(c)
となっているデータを、'error'を、その直前の値にしたいのです。
この場合、df$testを(1,2,1,4,4,8,9,8,8,8,8,1)に変換したい。
(**上記データは計測器がはくcsvファイルが元ですが、計測ミスでerrorがまぎれこむのです。)
1031:132人目の素数さん
22/04/17 17:54:41.52 EAjV4LS9.net
csvを読み込むときに、na.strings="error"を指定して、957のcomp.boforeで処理すればよい。
comp.beforeは適切な名前ではなく、自分はcomplete.by.prev.valueとしている。
1032:132人目の素数さん
22/04/17 21:01:31.48 XrFMJRy1.net
わざわざ自作関数作らなくてもfill()で一発じゃね?
1033:132人目の素数さん
22/04/17 21:14:48 PPC4aEZX.net
completeで思い出したけどtidyrパッケージを使うとこんな感じでできる。ネ申エクセルの
縦結合されたセルを処理するときなんかに便利。
NAしか処理してくれないので`error`がNAに置換されている前提のが前提です。
data.frame(
test = c(1,2,1,4,NA,8,9,8,NA,NA,NA,1)
) %>%
tidyr::fill(test)
fill()のリファレンス
URLリンク(tidyr.tidyverse.org)
1034:978
22/04/19 22:25:34.21 z85CnNf5.net
みなさん、ご回答ありがとうございました。
>>982 >>983 さんが教えてくださったfill関数を使ってみたいと思いましたが、
すいません!、データフレーム内のerrorをNAに変換する方法も教えていただけないでしょうか!
1035:132人目の素数さん
22/04/19 22:39:14.60 //tbogSZ.net
>>980
df$test <- as.numeric(df$test)
tidyr::fill(df, test)
1036:978
22/04/19 22:55:17.54 z85CnNf5.net
>>985 さん
ありがとうございました!
なるほど、簡単な手法でさくっとできるのですね、まだまだR
1037:になれないと、と痛感しました。みなさん、ありがとうございました!
1038:132人目の素数さん
22/04/19 23:01:31.24 Pb0ZefGO.net
>>984
979に書いてあるやん
1039:132人目の素数さん
22/05/01 17:44:32.12 Hvezzfn/.net
質問させてください
csvを読み込ませたいです。
ただし、このcsv、かき特徴があります。
1行目から62行目 いろいろな条件を記載。csvではなく、テキスト。
63行目から ヘッダー含めてcsvファイル形式。
末尾4行 また色々なことを記載。csvではなくテキスト。
最初の62行目までの読み込みをskipさせるのは
read.csv("test.csv", skip=62)
で対処できましたが、末尾4行をスキップさせるのはどうしたら良いでしょうか??
1040:132人目の素数さん
22/05/01 20:51:32.75 0HGOHjFC.net
読み込ませた後に最後の4行を削除させるのではダメ?あくまでも読み込み時にその4行をスキップしたい?
1041:132人目の素数さん
22/05/01 21:02:36.52 Hvezzfn/.net
ありがとうございます。
はい、読み込む時にやりたいです。
後々、フォルダにある数がわからないcsvファイルを一気に読み込んででーたふれーむを作りたいと考えてますので
1042:132人目の素数さん
22/05/01 21:10:29.65 0HGOHjFC.net
なるほど。ググったらこういう方法があるみたい。
URLリンク(stat.ethz.ch)
1043:132人目の素数さん
22/05/01 21:16:51.50 Hvezzfn/.net
ありがとうございます!!!
最高です!これ!ほんとに助かりました!!!
1044:132人目の素数さん
22/05/02 21:52:52.81 657pfLds.net
read.table()のnrowオプションって初めて知った。
前からあったっけ?
1045:132人目の素数さん
22/05/03 04:18:14.90 tPtc21F+.net
R-Tipsのページが見れなくなってますが誰か移転先を知りませんか?
URLリンク(cse.naro.affrc.go.jp)
1046:132人目の素数さん
22/06/02 19:30:28 nW18Ocyl.net
超巨大なデータフレーム(2x10^6行 x 1x10^4列)を扱おうとしてるんだけど、gatherとかしようとするとめちゃくちゃ遅い。高速化のコツとか知ってる人いますか?
1047:132人目の素数さん
22/06/02 20:10:10 hi2gb4hw.net
gather()関数はSupersededだから、pivot_longer()関数を使ってみては?
1048:132人目の素数さん
22/06/03 09:36:31.44 nzQguSnk.net
>>996
ちょっと早くなりました。ありがとう。
1049:132人目の素数さん
22/07/16 23:32:17.16 a0oJxJr1.net
Rで文字列の置換を行いたいのですが、
g = gray, y = yellowとしたいのにg→grayellowとなってしまいます。
正しく置換を行うのはどうすればよいのでしょうか?
1050:132人目の素数さん
22/07/17 11:30:52.27 Bwyb6l2P.net
どういう変換しているか分からないけど、結果を見る限り、gをgra"y"に変換した後にyをyellowに変換してるんじゃ?
1051:132人目の素数さん
22/07/17 12:25:56.34 XCTRc04D.net
>>998
>>999の指摘通りで下のようなことをやっているなら、
> x <- factor(sample(c("g", "y"), 20, TRUE))
> x <- gsub("g", "grey", x)
> gsub("y", "yellow", x)
[1] "greyellow" "greyellow" "greyellow" "yellow" "greyellow" "greyellow"
[7] "greyellow" "yellow" "yellow" "greyellow" "yellow" "yellow"
[13] "greyellow" "greyellow" "greyellow" "greyellow" "yellow" "greyellow"
[19] "greyellow" "yellow"
こうするのではなくて、
> gsub("^y", "yellow", x)
[1] "grey" "grey" "grey" "yellow" "grey" "grey" "grey" "yellow"
[9] "yellow" "grey" "yellow" "yellow" "grey" "grey" "grey" "grey"
[17] "yellow" "grey" "grey" "yellow"
こんな風に正規表現で工夫すればよいのでは。
なお、最も簡単な解決策は、green,yerrowの置換順序をyellow,green逆とにすればよい。
1052:132人目の素数さん
22/07/17 14:28:56.56 XCTRc04D.net
間違えた。
s/green,yerrow/grey,yellow/
s/yellow,green/yellow,grey/
1053:132人目の素数さん
22/07/17 15:05:31.68 gDs5lpUJ.net
>>999
>>1000
出来ました、ありがとうございます!
1054:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1808日 19時間 42分 19秒
1055:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています