【R言語】統計解析フリーソフトR 第6章【GNU R】at MATH
【R言語】統計解析フリーソフトR 第6章【GNU R】 - 暇つぶし2ch988: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:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch