From d2be9759e7b021b14b7a2c0f969f62c3248c5ae3 Mon Sep 17 00:00:00 2001 From: "David J. Bosak" Date: Mon, 4 Sep 2023 19:13:10 -0400 Subject: [PATCH] Reviewed documentation #117 --- Procs_Validation.docx | Bin 969343 -> 969494 bytes R/proc_sort.R | 6 +- README.md | 6 +- docs/articles/procs-dm.html | 64 +++++++++++------- docs/articles/procs-freq.html | 116 +++++++++++++++++---------------- docs/articles/procs-means.html | 52 +++++++++------ docs/articles/procs.html | 1 + docs/index.html | 6 +- docs/pkgdown.yml | 2 +- tests/testthat/test-sort.R | 23 +++++++ vignettes/procs-dm.Rmd | 59 ++++++++++------- vignettes/procs-freq.Rmd | 85 ++++++++++++------------ vignettes/procs-means.Rmd | 49 +++++++++----- vignettes/procs.Rmd | 1 + 14 files changed, 278 insertions(+), 192 deletions(-) diff --git a/Procs_Validation.docx b/Procs_Validation.docx index f4edc4d4c85d87487ba7b8c19bb6be06bbe69b43..57cbd27d46b8546782ea3d1e4100d421f50b8506 100644 GIT binary patch delta 36629 zcmV)AK*YcQlslG|JFv_Ke}xVXpGJiM0C=qh01*HH0C#V4WG`fIV|8t1ZgehqZEWm) z+j8Sbme{)^{0|7lcxR@gO3Hg8Yqn}PaqDhJ@3^C?XB>WVKqORxi?<=5QfZ&&H#Wll z1%HG;Wxm9j36KOpkW7FCDRoO7U6cSKaq`^q-16i<|I4@O#QB;mf3tKxdw&J5!IhKD zM)Pqx`~3duFTX@@-76={(P9AGrzk_N6F3Od^x^B00Q&dVmTirS*G6S z$Fr|-c2y2H`erxUe|Q-`s)zM}^9WpbhvX?WU6g^8F)1U_nhi#QF&v z5bEz-K{8bwf4q5dFVs|!3oVt;Y5=q~02?Kii^XaTw;bbUw2^K-PHHJut8ogd=yB2w zVxgrDYywjmARFi7`%a^v6<%-jvvD5Z$Jv_E^@vF~py+zIr)dR8i_gai!uQMh!(ua9 zdfaF~ZdBrRSHy9$g|^s`E(yIl%|}H-u?J_e>Pvnw-W`C5)VglxML`w|5c2l zKg_SmH*;On+R-}Z>VvYXZs+4C{kc&0$h$?njDJ*2Nx2{{m1+&qSJj%7>#Hnu1K$fG zb@iRH;Km={UjZNiA=q7C`gz%MF-Y#>he@vQa0vpBn^!M>Uh0o!@o{@&{`E8Snf<$Z z_G_&4e?M}s$}4_WzjjkTd$SqpB;!54%Rl@akG{m86X&n-BpsXeK;O=bFPXPgaS%!_ zJdLat9GnUy%{T9|MLbeuUM!O=S$<8fJ~;cp5(0+OKN$ocl&W_A@%R6&c`*CO-~UhT z)tU&~e1s*#F7iQxj|740$AXVaZrRUAyQqE;R(YNx@@J(XX5)8Tcr0f8%Y9Ovv9l=I zB1@+a%1lTyC!0?b=ac-jj}9PU7*O(qBJa=Y^ zUQFVpCEWRkbkZ&-Pm1pO=>8eu;CioStWD~d`!p-0JbC+dt?#vexIdFQ_t_5ahi>m$s(SOQl$jaHpX~k$dE0PWNaQTmu~%ZJc}n!S(;tfV7zHnp%D2I zCcdbvPyn#>h^MbsmLY-Ms8w55*PzdfYt>-yOPjJCb<4JT{`wQWcVBHs_F_ROoK#2!Hs`Ww30 zFMO?wr3ESfEy?fa#uHq_$$=9S$$_}ew(#SEmLzP zK(UieW2LZ^W=a>io>LMloji$WpC7asnfa@yv^pDW6DFO+OQqg2#aUUo0+xR{kI6D| zOiW3sKj&+jJ*bhNw7e#>Oj#G|Wk%zx$K>p(p$;EcI8J9@6%o?UO1#GgdNurf@>Ttj zqzYY2=T^Yi1-RSA%QP~n|{`U-U~_l z1i!Y*)G@gl^}{u&3v6SE3XSs**n$`+2$>g%piT@3V5sZ@(rxuWk{E~a-i}lGpzMa_ zwzIr{(+5ukPKVuTQ`3ciNVgFr+ZgjcXzztai3dl9-*4$2o=$bqlc zrDb~ikSqLmk%Iq`-X*ERdNQ-o7p_F=f85Z27Xku6k-oY?q6|?G=(x@n66<%)&7wcW z%If@5q|^r?s^+Pc8u{&{{3u!Pc2axkFFG0V z{W2XFic#JE@9Ng0#-94jpB9SmVx`H}w||e`Km^NA2I9+ zz2@v;mR}5+%ID3%qvGFk3ZoLg2Ie)2$KT==NaYvnjLHd@EHsN_RojOWA-|H%u+sJw z2DDoT4}4Q|T@W|aWx;=DK6{X0C}fQU$b&#)w~?WMGNc@Wz0!IfB>b2s(;i4L{Ai7T z1mp({dO<^FvCu`*H@@hFkx+92c4I?-6i*zKJ4QW$iFXmXBLQ%!Y+6|qa|$@GM|4{k zh}|TpDDo0>dPThf?51^HJ*^~B;))27hO-Gn0+6gYGpCqVy8-j#EX~t+U0!(Y)GeAJ z1c!JCN{=-nx)eheg*I!wl{BrHx%NzdL0_P}RH0n1&O))aGO9u$B_gsJPdSfJAYXVc z@Ebw_a72|Nu7@gi8%TTjzix64!T*d%?goA{bcdynFsU!6U1s1f6B9ly!rFJqqX}$h zCbMedyQ{3;_2AqNWaL6lyatU3^+MlJZs!cUE3T6=HV_C!uBX}P{Mue(L};jg-%@!u zrZf~7^=FHMvH1<4gEKau9^k&em9~;Xd3Bl@`pqCnv(a4XYQ@`|^ud!(TbSkk?KFvJ z*<0n6Ie%F!lBFZ)e{n|h*Y?bYc_cVnLI+1u0_TjTx1|30YjuoVJ0C2c%uQk&fw!JeO471lX zvF3A=11$v!0wX8-tIMgAKh8^8@P8Vf<8k0cp)mebm7>T)GV*mC=O~VU-$Tz19M41S zBi{4`&$LKTB4A+boa)NzgHQ&>x;&2KAsC$F5eWT=x{Wdw#*kz_uDg&OX0Rg-VR*YX zrN?@-kpx)hRQ8NfTVo*HQUA9wwaho2{H?xn+?&l(w9u7C56L+sPY{a223Mmf@B$Fp za#m$h$4Xu~RDC@}P^rs*=pvFw5pW@e4Zei|MlL0FzFmWEfuFVHwWVoKD|yg^Ar5gP zj0dGpFl_kUU1m@SSzS!fKF$w3ii2P;=bPn7OVeLwqxo`~jI?9(>0zpC!#@4(Ay(fU zULrUmL@|G}Y9M4G^+DbG+KsQuWRI1Ia;Q32N~uhss6o^7NCe}57($PhtK&K>OnuK6 z;if>l2D$})RuX}RUyB%wFotd;7YrES5{r6(t;-DBBm!@EI{T75&UAsN*6&{)mic@~ zh39G6nFufPXtTtgiU80s=ufWR>?}FKM(tFc2^afPteE_~>Op2msv&ExG$SD?Aq_55CvF<{+Nd3@)Ks%JZk(ZD1&rbGmJ54i_=o?%R zNFYK9Xv0aQO0z|f*TZ>T(6o&Y8!0G}R9C$i`A`~v@8#@Lpgc_~)PMDN0|6uqVch^- zgT95F`W;i+RAGjiV7TW9;3A=HRYSYLVbArR3;762GX7`V-_EsZ4OZX;1~6uwOHTQVE#WZBR0 z=fqooCh-?z7;l8)3^86tLh12lR{%_)4_RZqJB~ee>>o2`)W0Xo`P)0QF?0T?lOMHd zcl1OKJ*ziZZ9m%AfBEnSoA)&z`eR`SDo0FtUk{7LL>D&4rBgQi+6O&BD5eennGh6F zVv2p9p-upiFOcV7B;Suf;Cj(2xwP>iFhwwbsK*;lv>cux#;n!^PMB;k0Tv$ehxR-fVag4Pe55XIBAJg~)WFyuktoU*l!w=uI>RQL{5dKp0mp zp%*p^fEW*$?>ABn7tsY&AdbuBX{`&WfY`lE>=6gVSL(A-$iQ4>So)^sy9M+ueAVxN z9MT2D*Lf1m0`6~R>nN0g4C_YXag*Ao3ryRUNqn13ek&SanJnhZ{A|HaDrp$f=CY5l zy6&QS(btiz+fURbQEo|7)D;5~4jOLyc|@HHABEmlZwDXC2sT`&HRxOTs^2*z>ce}% zgnAK*P}7cbaRg;!+21`WPFXy&6wa4|1C5KPjMDS%yfSjn8nG{4uq z1Jnwb>hS0p!~yXraDzsWgAjoN$?8FlBQeoW9M-$oYnCVtUCa(_L>p-310f9q*jOa6 zKrWQ59!c-CHGh{lh#N3`g*T6Uf+cR6_C#V&dUc(6aAgSx19R$&fC8_){`* zkq9WFk@QK>EbqchxrUAM{3EBX`G1cQQ}Vz5D0U$>;A9j49~~$qGH`a<23~2CWWCR_ zfO}gqhz#AxW_##C2rJ-}d!^R>OX6&lroWUeOyd8wYGI=8BypC@ERCx-!}6NGf3LsT z`sAi3ioWcnW785vU7t_pS{oIAZ381pgi(Ly%f7z%{wf}gl!sy%#a#Y$uh{$jl@}Ew zR5}r|)s;#oLUTYKaJkGKdtrJ5Ry%)=lG-FlKz1c>a| zoKx#n*qcGh8SIJf?J$9t$=~*GZ7=#!76KK-d3~$;3NgQlZM=-|wr#wBtINd@?fZ3G zyLzrKR*i$u_Yw50YUQh>X;;h!v^9bcF0_caOp1n!sT|&rx+}Z5aWVeiU!xoH`k?z4}UA~Y4AW=``J#%b*Jh(*eWalbA2=XCxt;$7C&A9-2 z$X71r{&%<0VjJz{9ixeVt2iuhrTbGmW+D1ht0HX1HzZP0bpR(PfNMvF+i}vF?koB+ z`K(R9@F~fh-#I_T=~8|8^M_gP{OiA3O$4yWrOj;KIVWNQGzWt-?Ew}uZ|A+u!_8pH z@71#fy?<|kCJ1SOsXS0?J0zNlpMGdEe9;q4=2>ez;V6hOJ%hY|9>7x}7w>=neWLpx zF7DG&dFl5yLct*jLg*e?tB0J$AyVy#Rca+RNoS2JfL+fwX>EfV>p#}i>m(Nn@iJVoIXsQ)@|imdRP(~5mO5D^6)y2 zmtRhaR|qu{KQDEE$81eAeMxLCtx;_w%C3i?Z`_Q_;I#m`WQBf6hOV0X>F`@Xq-mz{ zN({d)=Z|YtV;g>D1VD&aIrR(RwE%g=3jGjEPm0$9qLR|YuyApyL^WwEzS%M~TwQKS zqYLBpb`p;?%>D4H)M9fN*fDrr>u!xirpB(TTx8Sb6iMQLOLC~Y!(eztN9ossr%s1a zLN-WTGw0^giui4{^i8}{L0JItfppq{c&)7xJ=K7o`>FM7$($H!yw(;0Y_)D7Nht@H zva?nom)y}0ui891r5>m*Qnb(m)kT1`WyH4ZEFZWKYz24Dhu7LF(UV_?z-viqTBwHV zBG6hcvSkl{_%uY&s-fj^c(w9Um>)6jH}~lDgJu<;GH*XcOpD=wPzeqc8y$tJ4*udH zKI*W??w=<4pWb$MT`ie@nZ)C3v(Kp;#8y#`KisR)lcn?C`Q_tZ!Z(g4iu%JQ;=za; z3D3V=te_eKEQ2)&O$$6 z*kn#Fg|nLd)mjtP1RA*#6{#c_w%0>=$gkstxgf~LyCNI zIh*8vxK&E2yi+bxc7b9RhQLMsVY?Pn;5KR_hJ&{4fkJzp{5pLo$jeru1?Vr9L@68gW1H*yVxl%cE^+xBVP{ zx&sk7k~|`pvlf2;M;pQ5Aas4R$L?q-H_1BvQ2?hAwjRNk9GH%tRc+=G3E82*R8ing ze2#)*3(u}SkVqJ#vYrhrww8Qa#4~5LVQGJo(2ZOgZgp8=GGf>SDO#qqg_Qc89r@Jn zzH{X5{Hs2QTUV5uI`~K3I_Eag{ba^}W-p;WGF*4Gc}VnW0-FQ4Gv{G8(fw@AV`=6n zCjDwo3`l3@81B_M<9U`$?yg(7p-wLS(Y9reL5i@~EH@+Ei#Rk@*&B3tfO)>Ar42gD z?OW!Br`wVBVbKuX8Vgq5nSWT$N6qgRH<~R6b`PQH@)m&hb^Eume+v?^5wgvHWfxS2 zXy3oJ-oIC2HWUVm*UXOX3bO%;I1bF_{fa(d5<`#f(+38)raIUu_Yipy@@5}jB4rqm zpuUH;vGuUn9JG5sV*Snz?(ef7sWQsp-CK^Y58u&SmH(S*Qn6bj>_(_2t35(P>U%+C zW8Pl~p>2B5hE190aT(EOBU%=JMx1Y&dJn^7R2nd(lDpfcH-jvO5igvO}fr|d^JM-I(ZdG$| zU(yb=>K)G8wJyiuwkIfR7Rk3oGCCzF>dG=pY)A}2B!C|bC5#p%eoWGT&-Zyzd1SSV zC}0sqRw22em@>_k5o9(2>cwcY%S|6M5S^mp^du=`H-@Ns2Kdpb$U@9mUY9{e)bU$Aj(lCgHi?nLgHZ=AF!PXY@^Pm`4!nv-d_%YCWQA!7SSbsBhifDd`W3?`q5V%F*+` za@53Jr1wMK>OYGwkLL>EPO9xX7rPWAeK5c*)=e{hPDlB}GI5N5-KxGi`t#TCi~Wm{ za`qFAfmj*2n=3!fM_)3{<+JQv{Ql}b&lm4*ZnDvRGL5rq#l(%S6e6#XZ-WT4= zo4U)_&TSM(5>RsnZB^{U$df_iO!M7(=a@Xo>ZkC3THZTXmVV1sn=GAHQ3DW3$z`KZ z0RXO>McTRvRYcVFc=gUXd;)+yL_CwFt@;EYqD1=0Bz|f>0f88ktNJgPD)z*2zVXQYA2pWo}Jxdkn1Q+92&S#(QJWEqKf1Ugter=(?LJw;8()DS` zn2y8rM_PrvosedMpN~nVUb5#LrbBF8^=qN)MXW|hI%7FX8CnpKu7w$rBc+Rm) zxK){RpW!i3`W`h)@i2s#QE1!W_q5d{yHCAsQxe4!Zvkj8hx=_5eQ;Dd>h;SAnP6&v zF~otUz10PpGvYZaL2?{4p;b`?=!+{i=fD`V<_y*vyz;)n#4 z46vzxjgKwwfD?}*YEv=X$8>Cec_WA<7K}A=FDHAWdEsmM#2LybT2#iCc7=Z6hQOw0 z)7jthNCb^7T9Eodh>Je3{VeRx(<>4X1;M)VSII%ggdzUetGJ}o^1;0* zi~w&QTn0TCadSN1i+5%;EZj5w&<}itykT@;-{LTa zC2=VgO!R18X<2l#L#MugI+RY!kn*`h!J4~WNgzED@}thr+`l#rQ<}0HU59wRx-tWR zL*HyOK08~3fZ#yjhA+W?q~4O{+4@TdtO5g`O|i;Wb;xYKDiF~YXARkBvCDQ?jYm|g zbTiqM!6ri4$fIN6MI@9PN*qs|;|f?{sJoCh&s&3maAAPzeHJ_pv1s*CT1r65FIS}Z zGz~>;ibE>zHpLg-~O_TmuFhitW%dL5yEks_qbqx4V<+=Ap~5C4`ux8pjQ{4-66F4*9-Oy6^eM3eTR%yo~$@Tlhqobn7ABZ*QPk+ zLI`bBWHxNdNWf`Ct%^fV&8C=379roJ_hY2ITXSH_76R*c3wqr?`DJeUqyD4ljWEN0>yX1KxS@U%Q{b0!IaK0`Pfl8G)y1XDHu{l?TQH-Q)7X1yOpsgB9 zVK1T~js}8%#-OcPk>Ex=x|p%5qaDww(z_=p$NCk!B6&+?z`sAn;TgL4oJSA=*MxL0 z9r2wMK!}~QcYv)xH1G|lANU(UOWH3pfZHEC@>PfN4)TWOEFLsm~sdKvnecndC7{C zluvhmT62g#=2f^hN5!8Eohx`c@f=4o45RRXi!uz)sWpr9fZH6E*NH|DPuLpWb#h@-400WfG6Cjh);LVjBzi!yoR|=*d#qyT5$=OZdjoR8fEY zzC~iTR7mJk$^x4{hkePp7wJxxd~?!`3y^GoQX`|SZKpe?fF%M^VB`M`GlfGGZRZGB z1k-IEw&UOOM@PrXpRT-ILU!5+uKK}Nu{n=08ZeudkI#vWXdp7`=vkejR>%DU$^{8R zn+)MFSj4NS?DOSDn^Vo8kO4-%RUOD6cqDZ^ZnJ~k+2q7k?*mrV7tctj=5z}O}Nd$AjA=Br{U5bo+r*14!YLy@cK_~%)ms=>^ zovP{Cu!D_mWE67=J)1<&FnAOVJUT0-q<;$Lu*zy8L`dYhm$Ts^*qX^^B8EGVusWO) z5&2;Gbuc(x=x^hCxqUvbrIZusb6~fou%X~el^=``+D>Bt+X3g@{ez9bg2mR zx%6dxWkr5K+>p`DQ5FZ%49AF0<7czUv>#2oZ%wtL%`qv=H>*@uza6aIvPK*cj98;A zmPkTFDvlxN&a6?D(C5e+apsahcpC6()(9aS=^fD;kgco{0-%VxL#n2MSGk~nK3OA( z84~6srq`^|3);Qfq?*RoaakjC0_-`mMgq8I_dvnFoD%-h+VQmJ3R=5OQpjKctakaG zJeA}tW0-QA!iW9y*;c1RrIOCId9~Yimmn}{{b!9w3zU8Aw|TWaLmGxc@B=ZZVb~h_ zjL4{Y+C3l<_gUjmr9B40Ud-2jcx=}`)fyrzoZK)WcA1Hd#}7LPyTq_dQw!-4b`IG5NzakKTx8_a&%_H4&*Vm~bf+*AfME_1~>n<3iw)2@kHwJU^wOSzy{3Rt>C z_hs87mAq`bWG9sbsPQ~=g2f?rZ}8)xnu`6!eJ^M~Eu~!$3MBLb(PwAJxe(f>4Q<#I zAt7*RPMSG8n_>zg&+}~96k-g_Q5;(ctlu#REH4?%8SvUy%xAx!RyhX<&_gO@F#I^q zK>KL}4@Guf&p^}aN%Y}=_tRp^BTNRB2+Nq}Z(u)dxj)oyx0DY#5YWcX9fD_D_PD;l zJ;6l!1pARq|AZls_#8LccHgPYC?g;|)W!E4D&h>AOrHyPTkZZ;<`EO2jg5F5ciVMl zAVI{qYm;a115Jw)422-li)`w3hLCRU?!IoQ+y&BRL#5rZD}o_^Ke(XbStge&2IqG@ zld}~wb)cP&Jt;l9PqTid09NwP31S|*ly9XCl&8{husX|0c{+ew?f)JK+_Iseab)ad zB=n-FdHNI*KJt8X>cR%%-7!Bab>DOA=b;G4Zz8CNU0fu|o0nm61a$4mdbDIso2pa^ zUmtARs9b5XX%Q`dsSt7pg|N%I1oa>YU9$b>MCBTw4i{vKoIV}mRh`|Qj0CJ zX>=V|YXQreh{2035C(`6vO4<+>Z7j>wVz?J#XeQmp}R4EBUHF9Y^tDZa6!xoCCTmjd1d7aH z{2Yo5xm4(mI0X+QtlY@ws>t+5ajm^x0Q)2e-A1^VaEPd9de7Pz_q$VjE8Vz;qiK7# zW$H-4JOreF)&BESXX=<25$HxX^%E~Gp*-|qavc-RAqxXnH|#hcqI+>8hZs=hMqPp% zG2|`@4xKk*KnDmRlR(|VNBxe$M|sJ-&@za#Sf27=e*8fFTIDB8{uugwq|%9jh_@z7>V-*X~=<1=f9fFh-z1FQ0mVX*jXX@=lR zrkK$t(K`$tPty#6Fe*V|le{FMI!7~v0-<)z5ST(1Feg8~BrLu*Lul$o_ZUgf^9Eyx!ho;q<0$e%<-1wDvGm(o-dMk5-dJ(+ zIyg^%zuQ>bC&a&TY`c;k%zaHYid>Wy@0_A6@7(UWD?-8rr*p^fh< z!Hp}MP92<~$Pa;yN8FdFd!>5)W8b1<2T%Ba_vxp8l(oSV!fH-F9+LU(@O1m6NuDL& ztjNoh%tEBI=2ftn7x*9|^|R-9r#Vgmc3FI-KsO<`t3FLjx&_*)&#=ox!-Qp_5Iz?= zkk@nSyHn6rq?{uK4Sm-K6ze6RmVyp_BDge}k$MUmbI4cKGz2rQ{x*Wpw`mDgix7u@ zjK3zJUsTtUCfPK)j?6$CN8~J}G@LQwu2`5e^}nI^%jsLvn$>ITTY@-;IN}%CxXBm* zZqX9r&~mqbK3f`fuypX5`j&KCgs?9{T}J$@@o0gvkNx_VwC0sD_dJy_mVR}O_* zF=@k!gCtUGA>QDAzfEx9_!|RWyE(LfYGzWyV}+6RP?ZSTj#2W*!+WNhzR#{Ve0YqX zY{uG{%-vu$U0ROovr+@sY^iuqIJ6qFH`G}k=gR6zN7sXE2!LEhVDs!mDrmsNMk}4; zSaQ3+N&_#|a`tw-T-PbtrUCRvTfG(YspkvS41+=uL^7ybVrWQllDxJ0O&QcoBrq@aZ!}Xxp-2!=_LW$=yRo%@4z-ShHyu^}wn% z0t@ik7uILrs0R52QHBrZkv{>kj&8`ZD?0ay4oiGjYTvCP=K zHma$sNkTCRtx8dc;MreCqZ;Y~NnNWG>xV$%ucJ{7W+5UVIC-0|?keJcwNXudSpz{J zg&cmhwmV22`G`?)@4L1Yuf8OTC= zZB%ot@8E`E=r@~%pOb{08r5(Rh7qwk2W%j4yEdwU5;7Q?fZf3AzHg(N0}+nbMm4J; zIt2CHPzJ;#tqw*@Dug^rNuwGX2!&O8@ir@I4=XcTgyXIL$*p@E_z!$bozaHARw zbZdFnZPwPTuNM!zme{;@tI>nKcB^UXvku*A0Cs^y!lt zYhJt7?5(1}fzO!LiP=3vDRnrk4AF>sq3a$9?+le)jw0lv9*;iWP$Rj7HAtr(1s~8t7vgGOO*F!-9R1PBfi@=THilL*Cqz37ABlyV=~of9jGGY`TNC zPkr@7*@>q3vbl4P^fDljFadNiQZ>EIy^wO`nGkzDy-d~j0VvyeFy=yNQgS^z(J%rj zL0GQ|uZ?J4Oip==Y8qQd=9JC;*mLBRDRhB`ykKBujzE86i2ZW<&@@!do<1~!aS@=4 zBzTp7AYI9OZy(;>KjnZ)*FV8~u0AxKmLSaih=#m}KYvC%TA=J>zdkf;Agil#07EbE ztj;$%d8U{H>eA-BDP|$_O=NvoV`$ZfrcWoCf)1VA#_WNnwMR^id@c6#KmPt7nG=3f z9&+=+|IdHkw=TDl9BaNxhvMw9$1$3y`(;mPBIE^^bFS&DU+1! z*gp zM^+e;5ayFEacuUoN4pltfb>@7PKHJbk~BW!iF$u+AhS<0+n|2&O8WMe9=P{+w~r6u z6BiGc*VpfZRS{_abn(CL?tiatAFktfU0pmps)y@~=8JA|Ex!Isd}HS)FCQKom-Y3> z>skaa?{4m*RHdQ-Y~pKgUR_*X2CFkIPP+W=my3_#i?px5;o*O;K3;>n z!xeuMAER+CS8FxX*Y-a)p8KNN&1d#*WA9=Ue0WkjC2e^qSH=rmk|&@F2-w+^z5Pns zn~O`06)A3#vkmU`$E%Cmhbr2D9s7B;fuDEv3?mBwa`)x>E4r&^vL)PX=n|!sj$?=m zEQ0=$nnc=)!M%pA_sU^eg6!P>JSB2Ex1oRgPQ4p&-tNXgz`P)`R&gI45u8N91t+blh0o!gzvNlE~>%KNW1bzAA z#iy(4Un=+-qDuXIRYCk3lA(FypW;1kAKzWx?c6JI8@-UdhDBp=81hyZb*Y+&ul0Y= zK<>Q{%W*Y2@8oL)Dt~kF^)7ZWLijaCVc~zhy6p~ZV-6ntf^=UT?IjX9+Up|e>zO<|bEM%Tq$%W3#8EmLse zcwod8HLaOKw0`{g%dgAbN%?-ea|#7lB3c|0YaBV$?)?4r&Bv?T5BE`^Fs=j~%0fJi zf-8|i3Os;Z9qO3XzuwnoO89?aVH=^LEaZnfW)U^qS#qd=#Jh_ag04>q#40-UjA*H_ znWYdw#|(1QZ{+X)9aG36E`c@AR3U0wcdd8A?%&A4GKjArl@PHGVg zq1D*vLnS{{GT~}V81a8f40gsQI?;>5#z+$=Q@^rE>DSpHFN&A7+Op*j&q`!abw0DuHU`%0AS@;wO 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 delta 36595 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 diff --git a/R/proc_sort.R b/R/proc_sort.R index e115458..d28ad45 100644 --- a/R/proc_sort.R +++ b/R/proc_sort.R @@ -242,7 +242,7 @@ get_dupkey <- function(dat, key = NULL) { } # Subset by key - kdat <- dat[ , key] + kdat <- dat[ , key, drop = FALSE] # Add counting variable kdat$..cnt <- 1 @@ -259,13 +259,13 @@ get_dupkey <- function(dat, key = NULL) { kcnt <- aggregate(kdat, klist, function(x){NROW(x)}, drop = TRUE) - kcnt + # kcnt # Filter out unique rows fkcnt <- kcnt[kcnt$..cnt > 1, ] # Pull out the key columns - fkcnt2 <- fkcnt[ , find.names(fkcnt, "key.*")] + fkcnt2 <- fkcnt[ , find.names(fkcnt, "key.*"), drop = FALSE] # Restore original key column names names(fkcnt2) <- sub("key.", "", names(fkcnt2), fixed = TRUE) diff --git a/README.md b/README.md index 2e7370b..3487320 100644 --- a/README.md +++ b/README.md @@ -13,16 +13,16 @@ The purpose of the **procs** package is to recreate commonly used SAS® -procedures in R. The first version of the package will attempt to recreate +procedures in R. The first version of the package will attempt to simulate PROC FREQ and PROC MEANS. Subsequent versions of the package will add more statistical procedures. -The package will also include a recreation of PROC TRANSPOSE, +The package will also include a conceptual reproduction of PROC TRANSPOSE, PROC SORT, and PROC PRINT. The reason these procedures are included is because they are frequently used in conjunction with the statistical procedures to prepare results for reporting. -There are three motivations for recreating SAS® statistical procedures in R: +There are three motivations for simulating SAS® statistical procedures in R: **1) Rich Outputs:** R provides a wide range of statistical packages and functions. However, these statistical functions frequently return a fragmented output. diff --git a/docs/articles/procs-dm.html b/docs/articles/procs-dm.html index ec71bb2..4ecce31 100644 --- a/docs/articles/procs-dm.html +++ b/docs/articles/procs-dm.html @@ -181,12 +181,11 @@

Default Transpose

Prefix and Suffix

-

Notice that in the default usage, all output column names have been -assigned generic names. You may control the output column names using -the prefix, suffix, and name +

You may control the output column names using the +prefix, suffix, and name parameters. The prefix and suffix will be used to construct the new transposed column names. The name -parameter value will be used as the name of the generic “NAME” column +parameter value will be used as the name of the generic “NAME” column, which identify the var parameter values:

# With prefix
 res <- proc_transpose(dat, name = VarName, prefix = Student)
@@ -338,18 +337,18 @@ 

Sort # Create sample data dat <- read.table(header = TRUE, text = ' ID Name Score - 1 David 74 - 2 Sam 45 - 3 Bane 87 - 3 Mary 92 - 4 Dane 23 - 5 Jenny 87 - 6 Simran 63 - 8 Priya 72 - 1 David 45 - 2 Ram 54 - 3 Bane 87 - 5 Ken 87') + 1 David 74 + 2 Sam 45 + 3 Bane 87 + 3 Mary 92 + 4 Dane 23 + 5 Jenny 87 + 6 Simran 63 + 8 Priya 72 + 1 David 45 + 2 Ram 54 + 3 Bane 87 + 5 Ken 87') # View data dat @@ -367,7 +366,7 @@

Sort # 11 3 Bane 87 # 12 5 Ken 87

Like proc_transpose, the function has a default usage, -which will sort by all variables:

+which is to sort by all variables:

 # Default sort
 res <- proc_sort(dat)
@@ -507,17 +506,16 @@ 

Keep # 7 Simran 63

-

Nodupkey +

Options

Another convenient feature of proc_sort is the -nodupkey parameter. This parameter will eliminate -duplicates based on the unique combination of values of the -by variables. For instance, to get a unique list of -students, you could use keep and -nodupkey = TRUE:

+nodupkey option. This option will eliminate duplicates +based on the unique combination of values of the by +variables. For instance, to get a unique list of students, you could use +keep and options = nodupkey:

 # Keep and Nodupkey
-res <- proc_sort(dat, by = Name, keep = Name, nodupkey = TRUE)
+res <- proc_sort(dat, by = Name, keep = Name, options = nodupkey)
 
 # View results
 res
@@ -532,6 +530,24 @@ 

Nodupkey# 10 Ram # 2 Sam # 7 Simran

+

There is also a dupkey option to retain only records +with duplicate key values. This feature would allow you to easily find +students who took the exam twice, and show the scores for each +attempt.

+
+# Keep and dupkey
+res <- proc_sort(dat, by = Name, options = dupkey)
+
+# View results
+res
+#   ID  Name Score
+# 1  3  Bane    87
+# 2  3  Bane    87
+# 3  1 David    74
+# 4  1 David    45
+

Note that the above dupkey option is not available in +SAS®. This option has been added to the proc_sort() +function for convenience.

diff --git a/docs/articles/procs-freq.html b/docs/articles/procs-freq.html index ab23f70..9214706 100644 --- a/docs/articles/procs-freq.html +++ b/docs/articles/procs-freq.html @@ -256,69 +256,16 @@

Weighted Frequencies

-

Output Datasets -

-

You may request datasets from the proc_freq function -using the output parameter. This parameter takes three -values: “all”, “report”, and “none”. The “all” keyword requests datasets -meant for output, and is the default. These datasets have standardized -column names, and sometimes have additional columns to help with data -manipulation. The “report” keyword requests the exact datasets used to -create the interactive report. For both keywords, if there is more than -one dataset, they will be returned as a list of datasets. The name of -the list item will identify the dataset. You may control the names of -the output tables in the list by using a named table request.

-

Here is an example of the “all” option:

-
# Request output data
-res <- proc_freq(dat, tables = v(x, y, MyCross = y * x), 
-                 output = all)
-
-# View results
-res
-$x
-  VAR CAT N CNT  PCT
-1   x   2 8   3 37.5
-2   x   3 8   2 25.0
-3   x   5 8   1 12.5
-4   x   6 8   2 25.0
-
-$y
-  VAR CAT N CNT  PCT
-1   y   A 8   3 37.5
-2   y   B 8   2 25.0
-3   y   C 8   3 37.5
-
-$MyCross
-   VAR1 VAR2 CAT1 CAT2 N CNT  PCT
-1     y    x    A    2 8   1 12.5
-2     y    x    A    3 8   0  0.0
-3     y    x    A    5 8   0  0.0
-4     y    x    A    6 8   2 25.0
-5     y    x    B    2 8   1 12.5
-6     y    x    B    3 8   1 12.5
-7     y    x    B    5 8   0  0.0
-8     y    x    B    6 8   0  0.0
-9     y    x    C    2 8   1 12.5
-10    y    x    C    3 8   1 12.5
-11    y    x    C    5 8   1 12.5
-12    y    x    C    6 8   0  0.0
-

Notice that the way output datasets are requested from the -proc_freq function is much simpler than the corresponding -mechanism in SAS®. With proc_freq, by default, all -requested tables and statistics will be returned in a list. No other -output parameters are needed.

-
-

Statistics Options

The options parameter also accepts statistics options. For two-way tables, you may request either Chi-Square or Fisher’s tests of association. Here is an example of the Chi-Square test:

-
+
 # Request Chi-Square and Output datasets
 res <- proc_freq(dat, tables = y * x, options = chisq)

-
+
 # View results
 res
 # $`y * x`
@@ -341,12 +288,67 @@ 

Statistics Options# 1 6.444444 6 0.3752853

+

Output Datasets +

+

You may control datasets returned from the proc_freq +function using the output parameter. This parameter takes +three basic values: “out”, “report”, and “none”. The “out” keyword +requests datasets meant for output, and is the default. These datasets +have standardized column names, and sometimes have additional columns to +help with data manipulation. The “report” keyword requests the exact +datasets used to create the interactive report. For both keywords, if +there is more than one dataset, they will be returned as a list of +datasets. The name of the list item will identify the dataset. You may +specify the names of the output tables in the list by using a named +table request.

+

Here is an example of the “out” option:

+
# Request output data
+res <- proc_freq(dat, tables = v(x, y, MyCross = y * x), 
+                 output = out)
+
+# View results
+res
+$x
+  VAR CAT N CNT  PCT
+1   x   2 8   3 37.5
+2   x   3 8   2 25.0
+3   x   5 8   1 12.5
+4   x   6 8   2 25.0
+
+$y
+  VAR CAT N CNT  PCT
+1   y   A 8   3 37.5
+2   y   B 8   2 25.0
+3   y   C 8   3 37.5
+
+$MyCross
+   VAR1 VAR2 CAT1 CAT2 N CNT  PCT
+1     y    x    A    2 8   1 12.5
+2     y    x    A    3 8   0  0.0
+3     y    x    A    5 8   0  0.0
+4     y    x    A    6 8   2 25.0
+5     y    x    B    2 8   1 12.5
+6     y    x    B    3 8   1 12.5
+7     y    x    B    5 8   0  0.0
+8     y    x    B    6 8   0  0.0
+9     y    x    C    2 8   1 12.5
+10    y    x    C    3 8   1 12.5
+11    y    x    C    5 8   1 12.5
+12    y    x    C    6 8   0  0.0
+

Notice that the way output datasets are requested from the +proc_freq function is much simpler than the corresponding +mechanism in SAS®. With proc_freq, by default, all +requested tables and statistics will be returned in a list. No other +output parameters are needed.

+
+

Data Shaping

The proc_freq function provides three options for shaping data: “wide”, “long”, and “stacked”. These options control how -the output data is organized. The options are best illustrated by an -example:

+the output data is organized. The options are also passed on the +output parameter. The shaping options are best illustrated +by an example:

 # Shape wide
 res1 <- proc_freq(dat, tables = y, 
diff --git a/docs/articles/procs-means.html b/docs/articles/procs-means.html
index 4651313..bdeb93c 100644
--- a/docs/articles/procs-means.html
+++ b/docs/articles/procs-means.html
@@ -336,13 +336,13 @@ 

Output Datasets

Similar to the proc_freq function, proc_means can return datasets. There are three options: -“all”, “report”, and “none”. The “all” option returns datasets meant for +“out”, “report”, and “none”. The “out” option returns datasets meant for further manipulation and analysis, and is the default. The “report” keyword requests the exact datasets used in the interactive report. Specifying either one of these options will cause the function to return data.

Here is an example that shows the difference in the “report” and -“all” options:

+“out” options:

 # Output dataset using "report" option
 res1 <- proc_means(dat, 
@@ -359,16 +359,16 @@ 

Output Datasets# Output dataset using "all" option res2 <- proc_means(dat, stats = v(median, sum, q1, q3), - output = all) + output = out) # View results res2 # TYPE FREQ VAR MEDIAN SUM Q1 Q3 # 1 0 8 x 3 29 2.0 5.5 # 2 0 8 z 65 506 57.5 75.5

-

As can be seen in the above example, the “all” output datasets -include additional variables for TYPE and FREQ. These additional -variables can be turned off with options:

+

As can be seen in the above example, the “out” dataset includes +additional variables for TYPE and FREQ. These additional variables can +be turned off with options:

 
 # Turn off TYPE and FREQ variables
@@ -467,16 +467,30 @@ 

Class # View results - two class variables res1 # CLASS1 CLASS2 TYPE FREQ VAR MEDIAN SUM Q1 Q3 -# 1 <NA> <NA> 0 8 x 3 29 2.0 5.5 -# 2 <NA> <NA> 0 8 z 65 506 57.5 75.5 -# 3 P A 1 3 x 6 14 2.0 6.0 -# 4 P A 1 3 z 70 230 60.0 100.0 -# 5 P B 1 1 x 2 2 2.0 2.0 -# 6 P B 1 1 z 10 10 10.0 10.0 -# 7 Q B 1 1 x 3 3 3.0 3.0 -# 8 Q B 1 1 z 67 67 67.0 67.0 -# 9 Q C 1 3 x 3 10 2.0 5.0 -# 10 Q C 1 3 z 63 199 55.0 81.0

+# 1 <NA> <NA> 0 8 x 3.0 29 2.0 5.5 +# 2 <NA> <NA> 0 8 z 65.0 506 57.5 75.5 +# 3 <NA> A 1 3 x 6.0 14 2.0 6.0 +# 4 <NA> A 1 3 z 70.0 230 60.0 100.0 +# 5 <NA> B 1 2 x 2.5 5 2.0 3.0 +# 6 <NA> B 1 2 z 38.5 77 10.0 67.0 +# 7 <NA> C 1 3 x 3.0 10 2.0 5.0 +# 8 <NA> C 1 3 z 63.0 199 55.0 81.0 +# 9 P <NA> 2 4 x 4.0 16 2.0 6.0 +# 10 P <NA> 2 4 z 65.0 240 35.0 85.0 +# 11 Q <NA> 2 4 x 3.0 13 2.5 4.0 +# 12 Q <NA> 2 4 z 65.0 266 59.0 74.0 +# 13 P A 3 3 x 6.0 14 2.0 6.0 +# 14 P A 3 3 z 70.0 230 60.0 100.0 +# 15 P B 3 1 x 2.0 2 2.0 2.0 +# 16 P B 3 1 z 10.0 10 10.0 10.0 +# 17 Q B 3 1 x 3.0 3 3.0 3.0 +# 18 Q B 3 1 z 67.0 67 67.0 67.0 +# 19 Q C 3 3 x 3.0 10 2.0 5.0 +# 20 Q C 3 3 z 63.0 199 55.0 81.0

+

Observe that the function produces statistics for each set of +combinations of the class variable. Each level of +combinations is identified by the TYPE value. To turn off the class +combinations, pass the “nway” option.

diff --git a/docs/index.html b/docs/index.html index 2f10e1e..b167906 100644 --- a/docs/index.html +++ b/docs/index.html @@ -120,9 +120,9 @@

-

The purpose of the procs package is to recreate commonly used SAS® procedures in R. The first version of the package will attempt to recreate PROC FREQ and PROC MEANS. Subsequent versions of the package will add more statistical procedures.

-

The package will also include a recreation of PROC TRANSPOSE, PROC SORT, and PROC PRINT. The reason these procedures are included is because they are frequently used in conjunction with the statistical procedures to prepare results for reporting.

-

There are three motivations for recreating SAS® statistical procedures in R:

+

The purpose of the procs package is to recreate commonly used SAS® procedures in R. The first version of the package will attempt to simulate PROC FREQ and PROC MEANS. Subsequent versions of the package will add more statistical procedures.

+

The package will also include a conceptual reproduction of PROC TRANSPOSE, PROC SORT, and PROC PRINT. The reason these procedures are included is because they are frequently used in conjunction with the statistical procedures to prepare results for reporting.

+

There are three motivations for simulating SAS® statistical procedures in R:

1) Rich Outputs: R provides a wide range of statistical packages and functions. However, these statistical functions frequently return a fragmented output. The user is often left to compile R statistical results into a readable report themselves.

SAS® software, on the other hand, provides the same statistical results, but with rich outputs. These outputs include multiple datasets, plots, and complete statistical reports. These rich outputs could be a benefit to R users.

2) Pre-Validation: There is an industry-wide movement to adopt R for statistical analysis. This effort is complicated by the fact that R statistical procedures frequently do not produce identical output to SAS®. Many hours are burned trying to figure out why R statistical results do not match SAS® statistical results.

diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index d77ed34..1bf3fc0 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -10,7 +10,7 @@ articles: procs-freq: procs-freq.html procs-means: procs-means.html procs: procs.html -last_built: 2023-09-04T21:11Z +last_built: 2023-09-04T23:09Z urls: reference: https://procs.r-sassy.org/reference article: https://procs.r-sassy.org/articles diff --git a/tests/testthat/test-sort.R b/tests/testthat/test-sort.R index 1272c92..4fd1ebc 100644 --- a/tests/testthat/test-sort.R +++ b/tests/testthat/test-sort.R @@ -204,3 +204,26 @@ test_that("sort12: dupkey without keep works.", { expect_equal(ncol(res), 4) }) + +test_that("sort13: Another dupkey test works.", { + + spsrt <- read.table(header = TRUE, text = ' + ID Name Score + 1 David 74 + 2 Sam 45 + 3 Bane 87 + 3 Mary 92 + 4 Dane 23 + 5 Jenny 87 + 6 Simran 63 + 8 Priya 72 + 1 David 45 + 2 Ram 54 + 3 Bane 87 + 5 Ken 87') + + res <- proc_sort(spsrt, by = Name, options = "dupkey") + + expect_equal(res$Name, c("Bane", "Bane", "David", "David")) + +}) diff --git a/vignettes/procs-dm.Rmd b/vignettes/procs-dm.Rmd index 606a276..1adf95f 100644 --- a/vignettes/procs-dm.Rmd +++ b/vignettes/procs-dm.Rmd @@ -78,11 +78,10 @@ res ### Prefix and Suffix -Notice that in the default usage, all output column names have been assigned -generic names. You may control the output column names using the `prefix`, +You may control the output column names using the `prefix`, `suffix`, and `name` parameters. The `prefix` and `suffix` will be used to construct the new transposed column names. The `name` parameter value will -be used as the name of the generic "NAME" column which identify +be used as the name of the generic "NAME" column, which identify the `var` parameter values: ```{r eval=FALSE, echo=TRUE} # With prefix @@ -244,18 +243,18 @@ some sample data: # Create sample data dat <- read.table(header = TRUE, text = ' ID Name Score - 1 David 74 - 2 Sam 45 - 3 Bane 87 - 3 Mary 92 - 4 Dane 23 - 5 Jenny 87 - 6 Simran 63 - 8 Priya 72 - 1 David 45 - 2 Ram 54 - 3 Bane 87 - 5 Ken 87') + 1 David 74 + 2 Sam 45 + 3 Bane 87 + 3 Mary 92 + 4 Dane 23 + 5 Jenny 87 + 6 Simran 63 + 8 Priya 72 + 1 David 45 + 2 Ram 54 + 3 Bane 87 + 5 Ken 87') # View data dat @@ -275,7 +274,7 @@ dat ``` Like `proc_transpose`, the function has a default -usage, which will sort by all variables: +usage, which is to sort by all variables: ```{r eval=FALSE, echo=TRUE} # Default sort res <- proc_sort(dat) @@ -416,14 +415,14 @@ res ``` -### Nodupkey -Another convenient feature of `proc_sort` is the `nodupkey` parameter. This -parameter will eliminate duplicates based on the unique combination of values +### Options +Another convenient feature of `proc_sort` is the `nodupkey` option. This +option will eliminate duplicates based on the unique combination of values of the `by` variables. For instance, to get a unique list of students, you -could use `keep` and `nodupkey = TRUE`: +could use `keep` and `options = nodupkey`: ```{r eval=FALSE, echo=TRUE} # Keep and Nodupkey -res <- proc_sort(dat, by = Name, keep = Name, nodupkey = TRUE) +res <- proc_sort(dat, by = Name, keep = Name, options = nodupkey) # View results res @@ -439,5 +438,21 @@ res # 2 Sam # 7 Simran ``` +There is also a `dupkey` option to retain only records with duplicate +key values. This feature +would allow you to easily find students who took the exam twice, and show +the scores for each attempt. +```{r eval=FALSE, echo=TRUE} +# Keep and dupkey +res <- proc_sort(dat, by = Name, options = dupkey) - +# View results +res +# ID Name Score +# 1 3 Bane 87 +# 2 3 Bane 87 +# 3 1 David 74 +# 4 1 David 45 +``` +Note that the above `dupkey` option is not available in SAS®. This option +has been added to the `proc_sort()` function for convenience. diff --git a/vignettes/procs-freq.Rmd b/vignettes/procs-freq.Rmd index 2a6825f..f4147cc 100644 --- a/vignettes/procs-freq.Rmd +++ b/vignettes/procs-freq.Rmd @@ -158,25 +158,59 @@ proc_freq(dat, tables = y, weight = z) ``` + +## Statistics Options +The `options` parameter also accepts statistics options. For two-way tables, +you may request either Chi-Square or Fisher's tests of association. +Here is an example of the Chi-Square test: +```{r eval=FALSE, echo=TRUE} +# Request Chi-Square and Output datasets +res <- proc_freq(dat, tables = y * x, options = chisq) +``` + + +```{r eval=FALSE, echo=TRUE} +# View results +res +# $`y * x` +# VAR1 VAR2 CAT1 CAT2 N CNT PCT +# 1 y x A 2 8 1 12.5 +# 2 y x A 3 8 0 0.0 +# 3 y x A 5 8 0 0.0 +# 4 y x A 6 8 2 25.0 +# 5 y x B 2 8 1 12.5 +# 6 y x B 3 8 1 12.5 +# 7 y x B 5 8 0 0.0 +# 8 y x B 6 8 0 0.0 +# 9 y x C 2 8 1 12.5 +# 10 y x C 3 8 1 12.5 +# 11 y x C 5 8 1 12.5 +# 12 y x C 6 8 0 0.0 +# +# $`chisq:y * x` +# CHISQ CHISQ.DF CHISQ.P +# 1 6.444444 6 0.3752853 + +``` + ## Output Datasets -You may request datasets from the `proc_freq` function using the `output` -parameter. This parameter takes three values: "all", "report", and "none". -The "all" keyword requests datasets meant for output, and is the default. +You may control datasets returned from the `proc_freq` function using the `output` +parameter. This parameter takes three basic values: "out", "report", and "none". +The "out" keyword requests datasets meant for output, and is the default. These datasets have standardized column names, and sometimes have additional columns to help with data manipulation. The "report" keyword requests the exact datasets used to create the interactive report. For both keywords, if there is more than one dataset, they will be returned as a list of datasets. The name of the list item will identify the dataset. You may -control the names of the output tables in the list by using a +specify the names of the output tables in the list by using a named table request. -Here is an example of the -"all" option: +Here is an example of the "out" option: ```{r eval=FALSE, echo=TRUE} # Request output data res <- proc_freq(dat, tables = v(x, y, MyCross = y * x), - output = all) + output = out) # View results res @@ -214,45 +248,12 @@ is much simpler than the corresponding mechanism in SAS®. With `proc_freq`, by default, all requested tables and statistics will be returned in a list. No other output parameters are needed. -## Statistics Options -The `options` parameter also accepts statistics options. For two-way tables, -you may request either Chi-Square or Fisher's tests of association. -Here is an example of the Chi-Square test: -```{r eval=FALSE, echo=TRUE} -# Request Chi-Square and Output datasets -res <- proc_freq(dat, tables = y * x, options = chisq) -``` - - -```{r eval=FALSE, echo=TRUE} -# View results -res -# $`y * x` -# VAR1 VAR2 CAT1 CAT2 N CNT PCT -# 1 y x A 2 8 1 12.5 -# 2 y x A 3 8 0 0.0 -# 3 y x A 5 8 0 0.0 -# 4 y x A 6 8 2 25.0 -# 5 y x B 2 8 1 12.5 -# 6 y x B 3 8 1 12.5 -# 7 y x B 5 8 0 0.0 -# 8 y x B 6 8 0 0.0 -# 9 y x C 2 8 1 12.5 -# 10 y x C 3 8 1 12.5 -# 11 y x C 5 8 1 12.5 -# 12 y x C 6 8 0 0.0 -# -# $`chisq:y * x` -# CHISQ CHISQ.DF CHISQ.P -# 1 6.444444 6 0.3752853 - -``` - ## Data Shaping The `proc_freq` function provides three options for shaping data: "wide", "long", and "stacked". These options control how the output -data is organized. The options are best illustrated by an example: +data is organized. The options are also passed on the `output` parameter. +The shaping options are best illustrated by an example: ```{r eval=FALSE, echo=TRUE} # Shape wide res1 <- proc_freq(dat, tables = y, diff --git a/vignettes/procs-means.Rmd b/vignettes/procs-means.Rmd index 75d5cf3..e93e3e6 100644 --- a/vignettes/procs-means.Rmd +++ b/vignettes/procs-means.Rmd @@ -115,14 +115,14 @@ proc_means(dat, stats = v(median, sum, q1, q3)) ## Output Datasets Similar to the `proc_freq` function, `proc_means` can return datasets. -There are three options: "all", "report", and "none". The -"all" option returns datasets meant for further manipulation and analysis, and +There are three options: "out", "report", and "none". The +"out" option returns datasets meant for further manipulation and analysis, and is the default. The "report" keyword requests the exact datasets used in the interactive report. Specifying either one of these options will cause the function to return data. -Here is an example that shows the difference in the "report" and "all" options: +Here is an example that shows the difference in the "report" and "out" options: ```{r eval=FALSE, echo=TRUE} # Output dataset using "report" option res1 <- proc_means(dat, @@ -139,7 +139,7 @@ res1 # Output dataset using "all" option res2 <- proc_means(dat, stats = v(median, sum, q1, q3), - output = all) + output = out) # View results res2 @@ -148,7 +148,7 @@ res2 # 2 0 8 z 65 506 57.5 75.5 ``` -As can be seen in the above example, the "all" output datasets include additional +As can be seen in the above example, the "out" dataset includes additional variables for TYPE and FREQ. These additional variables can be turned off with options: ```{r eval=FALSE, echo=TRUE} @@ -250,17 +250,30 @@ Here is the output dataset: # View results - two class variables res1 # CLASS1 CLASS2 TYPE FREQ VAR MEDIAN SUM Q1 Q3 -# 1 0 8 x 3 29 2.0 5.5 -# 2 0 8 z 65 506 57.5 75.5 -# 3 P A 1 3 x 6 14 2.0 6.0 -# 4 P A 1 3 z 70 230 60.0 100.0 -# 5 P B 1 1 x 2 2 2.0 2.0 -# 6 P B 1 1 z 10 10 10.0 10.0 -# 7 Q B 1 1 x 3 3 3.0 3.0 -# 8 Q B 1 1 z 67 67 67.0 67.0 -# 9 Q C 1 3 x 3 10 2.0 5.0 -# 10 Q C 1 3 z 63 199 55.0 81.0 +# 1 0 8 x 3.0 29 2.0 5.5 +# 2 0 8 z 65.0 506 57.5 75.5 +# 3 A 1 3 x 6.0 14 2.0 6.0 +# 4 A 1 3 z 70.0 230 60.0 100.0 +# 5 B 1 2 x 2.5 5 2.0 3.0 +# 6 B 1 2 z 38.5 77 10.0 67.0 +# 7 C 1 3 x 3.0 10 2.0 5.0 +# 8 C 1 3 z 63.0 199 55.0 81.0 +# 9 P 2 4 x 4.0 16 2.0 6.0 +# 10 P 2 4 z 65.0 240 35.0 85.0 +# 11 Q 2 4 x 3.0 13 2.5 4.0 +# 12 Q 2 4 z 65.0 266 59.0 74.0 +# 13 P A 3 3 x 6.0 14 2.0 6.0 +# 14 P A 3 3 z 70.0 230 60.0 100.0 +# 15 P B 3 1 x 2.0 2 2.0 2.0 +# 16 P B 3 1 z 10.0 10 10.0 10.0 +# 17 Q B 3 1 x 3.0 3 3.0 3.0 +# 18 Q B 3 1 z 67.0 67 67.0 67.0 +# 19 Q C 3 3 x 3.0 10 2.0 5.0 +# 20 Q C 3 3 z 63.0 199 55.0 81.0 ``` +Observe that the function produces statistics for each set of combinations +of the `class` variable. Each level of combinations is identified by the +TYPE value. To turn off the class combinations, pass the "nway" option. ### By Now let's see what happens when we use the `by` parameter with @@ -325,9 +338,9 @@ shaping options can reduce the number of transformations needed to get to your target table. There are three shaping options: "wide", "long", and "stacked". The "wide" -options is the default, and has the statistics in columns and variables in -rows. The "long" option has statistics in rows and variables in columns. -The "stacked" option has both statistics and variables in rows. +option is the default, and places the statistics in columns and variables in +rows. The "long" option places statistics in rows and variables in columns. +The "stacked" option puts both statistics and variables in rows. The following example illustrates the differences between these data shaping options: diff --git a/vignettes/procs.Rmd b/vignettes/procs.Rmd index 6d33bc4..7f04558 100644 --- a/vignettes/procs.Rmd +++ b/vignettes/procs.Rmd @@ -275,6 +275,7 @@ Those articles include: * [Data Manipulation Functions](procs-dm.html) * [Example 1: Demographics](procs-example1.html) * [Example 2: Adverse Events](procs-example2.html) +* [Example 3: Disposition](procs-example3.html)