トップページ数学
1002コメント395KB
【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
レス数が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/
0952132人目の素数さん
垢版 |
2022/03/27(日) 22:42:10.78ID:UiNoGcwm
ヘタに抽象化せずに
隠さずに具体例を挙げて
FromとToを書けば無駄なやり取りをせずにすむ。
0954132人目の素数さん
垢版 |
2022/03/27(日) 22:47:45.39ID:colv4Rae
まあ、落ち着け。時間データをクレンジングしたいんだとは思うけどもう少し元データについて整理しなされ。
0955939
垢版 |
2022/03/27(日) 22:57:08.96ID:nv2FRWMk
>>953
>>954
ありがとうございます。

データが多いので、下手に抽象化してしまいましたが、
今手元のデータ例では、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
0957132人目の素数さん
垢版 |
2022/03/28(月) 00:36:05.49ID:wfEbVN/P
これなら、修正箇所が少なくても多くてもパフォーマンスは変わらないはず。

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 を引き継げばよい
0958132人目の素数さん
垢版 |
2022/03/28(月) 01:12:01.08ID:srY6abow
>>955
寝る前だったので、秒の部分だけでサンプルデータコードにしているので、そこは、
適宜、実際のデータに合わせて修正して。

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連続以上の場合は、最後の行の
処理を参考に追加してみてください。
0959939
垢版 |
2022/03/28(月) 11:11:48.47ID:H+9Gp8uW
>>958
ありがとうございます。
なるほど、if_elseをそのように使うのですね。
条件の中で二つのベクトルを使ってダメだったので、諦めてました。
勉強になりました!!
0960132人目の素数さん
垢版 |
2022/03/28(月) 11:56:48.44ID:srY6abow
>>959
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))
0961939
垢版 |
2022/03/28(月) 12:17:31.10ID:H+9Gp8uW
>>960
なるほど、さらにありがとうございます。
case_whenやis.na関数を使って、例外処理をなさっているのですね。
非常に勉強になりました。
確かに私があげていたlag関数でのdefault設定だと例外だというのが後で見てわかりづらいですね。
ありがとうございました!!
0963939
垢版 |
2022/03/28(月) 14:04:18.16ID:6B8xjzPg
>>962
すいません、前提をいろいろ省略していて、、、
そこは条件文の重ね書きか、modをつかって解決しようとかんがえてました
0964132人目の素数さん
垢版 |
2022/03/28(月) 17:02:57.35ID:srY6abow
日付も含んだ日時情報として記録されている、もしくは、正しい日付を補完できる
のであれば、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」に修正できるかと。

データが飛んでたりするなら>>957さんの処理を応用すれば良いかと。
0965939
垢版 |
2022/03/28(月) 19:37:40.90ID:H+9Gp8uW
>>964
そこは正直迷いました、タイムデータを作るのが先か、秒を修正するのが先か。
まずは、秒修正を先にしたのが、Rでのタイムデータの操作と数値データ操作が
どっちが早いかわからなかったので、まずはとっつきやすい数値データを修正して時間データにすることにしたのです。

>>957
礼を述べるのが遅れてすいません。
データが飛んでるところを修正するのに使用いたします。ありがとうございます!!
0966132人目の素数さん
垢版 |
2022/03/31(木) 14:09:36.00ID:MFVXsplM
こちらで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)
が出て止まってしまいますので、どうも()内を認識してくれないようです。

もし対処の方法をご存じの方がおられましたら、ご教示いただければ
ありがたく存じます。
0967132人目の素数さん
垢版 |
2022/03/31(木) 23:46:22.65ID:YJpZ/tmn
>>966
exponentialがrstanarmからじゃなくて他のパッケージから呼び出されてるとか?
試しにrstanarm::exponential(0.0008)で試してみては?
0968132人目の素数さん
垢版 |
2022/04/01(金) 00:14:55.42ID:zUpPvDgR
ホントは一両日日跨ぎデータはスピノール的な情報として扱わないと
西から出たおひさまが東に沈む
地球の回転に逆らって高速飛行した時の不具合が出てくる。
0969132人目の素数さん
垢版 |
2022/04/01(金) 00:16:31.25ID:zUpPvDgR
地球一周航海して暦が一日ズレるマゼラン以降の話でもある。

多分ガウスは勘付いてたっぽい。
0970132人目の素数さん
垢版 |
2022/04/01(金) 05:42:17.81ID:kP8tAwPH
>>967

966です。早速ご教示いただきまして、どうもありがとうございました。
ご指摘の通りでした。おかげさまで大変勉強になりました。
重ねて厚く御礼申し上げます。
0971132人目の素数さん
垢版 |
2022/04/06(水) 00:13:06.16ID:0iZ26VyL
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, header=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")
0973132人目の素数さん
垢版 |
2022/04/06(水) 00:37:00.36ID:b2LBb0Tv
あくまでも print の仕様であって、中身は問題ないはず。as.numeric してみると1秒ごとに1増えるのがわかるはず。
0974971
垢版 |
2022/04/07(木) 14:27:54.56ID:IW6MEgzS
ご回答ありがとうございます。
それが、as.numericしても値がかわってないのです。なので困惑してます。
0977971
垢版 |
2022/04/07(木) 22:25:10.05ID:pOGo0jeY
>>976
それでした!!

newDate <-as.POSIXct(tmp[,1])

library(lubridate)
newDate<-ymd_hms(tmp[,1],tz="Japan")
で変換したところ、ほぼ全てのデータが時刻まで表示されるようになったのですが、
ごく数個、parse errorとなり、NAに変換されてました。
かくにんすると、元データが、"00:00:00"の時だけ、日付になってました。

助かりました。ありがとうございました。
0978132人目の素数さん
垢版 |
2022/04/17(日) 16:45:16.53ID:2Fhpn5bu
(質問)
データフレーム内で、数値データに文字列'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がまぎれこむのです。)
0979132人目の素数さん
垢版 |
2022/04/17(日) 17:54:41.52ID:EAjV4LS9
csvを読み込むときに、na.strings="error"を指定して、957のcomp.boforeで処理すればよい。
comp.beforeは適切な名前ではなく、自分はcomplete.by.prev.valueとしている。
0981132人目の素数さん
垢版 |
2022/04/17(日) 21:14:48.98ID:PPC4aEZX
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()のリファレンス
https://tidyr.tidyverse.org/reference/fill.html
0982978
垢版 |
2022/04/19(火) 22:25:34.21ID:z85CnNf5
みなさん、ご回答ありがとうございました。
>>980 >>981 さんが教えてくださったfill関数を使ってみたいと思いましたが、
すいません!、データフレーム内のerrorをNAに変換する方法も教えていただけないでしょうか!
0984978
垢版 |
2022/04/19(火) 22:55:17.54ID:z85CnNf5
>>983 さん
ありがとうございました!
なるほど、簡単な手法でさくっとできるのですね、まだまだRになれないと、と痛感しました。みなさん、ありがとうございました!
0986132人目の素数さん
垢版 |
2022/05/01(日) 17:44:32.12ID:Hvezzfn/
質問させてください

csvを読み込ませたいです。
ただし、このcsv、かき特徴があります。

1行目から62行目 いろいろな条件を記載。csvではなく、テキスト。
63行目から ヘッダー含めてcsvファイル形式。
末尾4行 また色々なことを記載。csvではなくテキスト。

最初の62行目までの読み込みをskipさせるのは
read.csv("test.csv", skip=62)
で対処できましたが、末尾4行をスキップさせるのはどうしたら良いでしょうか??
0987132人目の素数さん
垢版 |
2022/05/01(日) 20:51:32.75ID:0HGOHjFC
読み込ませた後に最後の4行を削除させるのではダメ?あくまでも読み込み時にその4行をスキップしたい?
0988132人目の素数さん
垢版 |
2022/05/01(日) 21:02:36.52ID:Hvezzfn/
ありがとうございます。
はい、読み込む時にやりたいです。
後々、フォルダにある数がわからないcsvファイルを一気に読み込んででーたふれーむを作りたいと考えてますので
0990132人目の素数さん
垢版 |
2022/05/01(日) 21:16:51.50ID:Hvezzfn/
ありがとうございます!!!
最高です!これ!ほんとに助かりました!!!
0991132人目の素数さん
垢版 |
2022/05/02(月) 21:52:52.81ID:657pfLds
read.table()のnrowオプションって初めて知った。
前からあったっけ?
0993132人目の素数さん
垢版 |
2022/06/02(木) 19:30:28.80ID:nW18Ocyl
超巨大なデータフレーム(2x10^6行 x 1x10^4列)を扱おうとしてるんだけど、gatherとかしようとするとめちゃくちゃ遅い。高速化のコツとか知ってる人いますか?
0996132人目の素数さん
垢版 |
2022/07/16(土) 23:32:17.16ID:a0oJxJr1
Rで文字列の置換を行いたいのですが、
g = gray, y = yellowとしたいのにg→grayellowとなってしまいます。
正しく置換を行うのはどうすればよいのでしょうか?
0997132人目の素数さん
垢版 |
2022/07/17(日) 11:30:52.27ID:Bwyb6l2P
どういう変換しているか分からないけど、結果を見る限り、gをgra"y"に変換した後にyをyellowに変換してるんじゃ?
0998132人目の素数さん
垢版 |
2022/07/17(日) 12:25:56.34ID:XCTRc04D
>>996
>>997の指摘通りで下のようなことをやっているなら、
> 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逆とにすればよい。
1000132人目の素数さん
垢版 |
2022/07/17(日) 15:05:31.68ID:gDs5lpUJ
>>997
>>998
出来ました、ありがとうございます!
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1808日 19時間 42分 19秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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