Hatena::ブログ(Diary)

盆栽日記

2018-02-11

as.Dateするときはタイムゾーンをちゃんと指定しよう問題

POSIXctな時刻データにas.Dateすると、1日前の日付に変わってしまう。

> as.POSIXct("2001-01-01 00:00:01")
[1] "2001-01-01 00:00:01 JST"
> as.Date(as.POSIXct("2001-01-01 00:00:01"))
[1] "2000-12-31"

これはタイムゾーンを指定しないとGMTと解釈されるためであり、タイムゾーンを適切に指定すれば問題ない。

> as.Date(as.POSIXct("2001-01-01 00:00:01"), tz = "Asia/Tokyo")
[1] "2001-01-01"

怖い。

2018-01-02

RStudioでPull/Pushボタンがグレーアウトしている時の対処

コマンドラインからgit pushする際に -u をつけてpush先のブランチをデフォルト設定しておくこと。

https://www.r-bloggers.com/things-i-forget-pushpull-greyed-out-in-rstudio/

https://qiita.com/sunstripe/items/a39f4bb835e1f08760e7

そもそもVersion Controlが有効にならない時はXCodeをインストールして、Command Line Toolを入れること。

2017-09-01

tidyrのspread()の列の並べ替えを明示的に指定する

tidyrパッケージのspread()でwide-formatのデータに変換した時の列の順序を明示的に指定したい。方法はいくつかあるが、keyに指定する列にfactorでlevelを与えておくのがわかりやすかったので採用。

https://stackoverflow.com/questions/29381069/implicit-sorting-in-tidyrspread-and-dplyrsummarise

2017-08-07

write.xlsxで複数シートに一度に書き込む

最近、XLConnectパッケージからopenxlsxパッケージに鞍替えしました。

理由は少しでも大きななデータをExcelシートに出力しようとするとXLConnectでは対応できないケースがあったからです。

で、openxlsxについての記事はたくさん書かれているのだけれども、その中のwrite.xlsx()については情報が見当たらなかったのでメモ。

ポイントは出力したデータをリストにして渡すということです。

library(openxlsx)
smp <- list("IRIS1"=iris, "IRIS2"=iris)
write.xlsx(smp, "sample.xlsx")

これでIRIS1、IRIS2というシートにそれぞれirisデータが出力されているはずです。

2017-07-27

口コミからプロバイダの速度を比較する

プロバイダわからん。

とりあえず下りの速度が遅すぎなければいい。

ということで口コミサイトの結果から比較する。

以下書きなぐりコード。

library(rvest)
library(dplyr)
library(tidyr)
library(stringi)  

# 以下よりソースをダウンロード
# http://netspeed.studio-radish.com/cgi-bin/netspeed/openresult/openresult.cgi

dat <- read_html("~/downloads/result.html")
numbers <- dat %>% html_nodes(xpath="//*[contains(@class,'graphmarker')]") %>% html_text()
tags <- dat %>% html_nodes(xpath="//nobr") %>% html_text()
detail <- dat %>% html_nodes(xpath="//*[contains(@class,'speeddata2')]") %>% html_text()
result <- data.frame(type = tags[tags %in% c("上り","下り")],
                     speed = gsub("Mbps|kbps", "", numbers) %>% as.numeric(),
                     stringsAsFactors = FALSE)
result$speed <- if_else(grepl("kbps",numbers),result$speed/1000, result$speed)

# 下りの時にインクリメント
i <- 0
result$num <- NA
for(n in seq_len(nrow(result))){
  if(result$type[n]=="下り"){
    i <- i + 1  
    result$num[n] <- i
  }else{
    result$num[n] <- i
  }

}

result_s <- result %>% spread(key=type, value=speed)
result_s$detail <- gsub("\\n|\\t", "", detail)
result_s$provider <- result_s$detail %>% stri_replace_first_regex(".+プロバイダ\\: (.*)測定地.+$","$1")
result_s$provider <- ifelse(grepl("使用回線", result_s$provider), NA, result_s$provider)

final <- result_s %>% group_by(provider) %>% summarise(count=n(), 
                                              mean_上り=mean(上り),
                                              max_上り=max(上り),
                                              min_上り=min(上り),
                                              median_上り=median(上り),
                                              mean_下り=mean(下り),
                                              max_下り=max(下り),
                                              min_下り=min(下り),
                                              median_下り=median(下り)
                                              )

library(openxlsx)
write.xlsx(final, "プロバイダ間比較.xlsx")
Connection: close