@kiina (陽 桜木)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

RStudioを使って時間のデータの処理

解決したいこと

ミリ秒を含む時間データが入力されたcsvファイル(data.csv)があります。RStudioを使って、時間データを編集したいと考えています。具体的には、列名(localtime)に「9:10:56.999」のように入力されています。localtime列のデータ型はcharacterです。教えていただきたいのは、

1.ミリ秒以下(小数点第一位)を四捨五入して「9:10:57」にする方法
2.上記の時間に3時間を足して「12:10:57」にする方法

解決方法をご存じの方、どうかご教示ください。よろしくお願いいたします。

RStudioはVersion 1.4.1106を使っています。

発生している問題・エラー

df2 <- round(df1$localtime, digits = 0)
 round(df1$localtime, digits = 0) でエラー: 
   数学関数に数値でない引数が渡されました 
0 likes

2Answer

日付は置いておいて時間のみを扱うのであればhmsパッケージがいいようです.

library(tidyverse)
library(hms)
localtime <- "09:10:56.999"
hms_localtime <- as_hms(localtime)
hms_localtime
# 09:10:56.999
round(hms_localtime) %>% as_hms() 
# 09:10:57
(round(hms_localtime) + hms(hours = 3)) %>% as_hms()
# 12:10:57
0Like

Comments

  1. @kiina

    Questioner

    ご回答をいただき、ありがとうございました。大変参考になりました。データ分析にはcsvファイルを使っているので、csvファイルを読み込んだデータフレームに対して、ご教示いただいたコードを参考に下記のコードで実行したのですが、round関数を実行したところで、エラーとなってしまいました。

    library(tidyverse)
    library(hms)

    df1 <- read.csv("projectx.csv", header=T, sep=",")
    df2 <- as_hms(df1$localtime)
    df3 <- cbind(df1, df2) #ここまではOK

    df4 <- round(df3$localtime) #これを実行すると下記のエラーが表示される
     round(df5$localtime) でエラー: 数学関数に数値でない引数が渡されました

    考えられる原因が分かれば、教えて頂けると助かります。
    どうぞよろしくお願いいたします。

df1$localtimeを呼び出した時点でこれは単なるベクトルになってしまっているので,列名等のもともとデータフレームのときに持っていた情報を失ってしまっており,cbindした後のlocaltimedf1にある文字列型の列を参照しているせいでしょう.

df1 <- data.frame(
  localtime = c("09:10:56.999", "12:05:01.400", "16:01:01.100")
)
df2 <- as_hms(df1$localtime)
df3 <- cbind(df1, df2)
df3
#      localtime          df2
# 1 09:10:56.999 09:10:56.999
# 2 12:05:01.400 12:05:01.400
# 3 16:01:01.100 16:01:01.100
str(df3)
# 'data.frame':	3 obs. of  2 variables:
#  $ localtime: chr  "09:10:56.999" "12:05:01.400" "16:01:01.100"
#  $ df2      : 'hms' num  09:10:56.999 12:05:01.400 16:01:01.100
#   ..- attr(*, "units")= chr "secs"

この場合,df2となっている列に対してroundを使うか

round(df3$df2) %>% as_hms()
# 09:10:57
# 12:05:01
# 16:01:01

もしくは,もともとのlocaltimeを置き換えるかのどちらかでしょうか.

df1 <- df1 %>%
  mutate(localtime = as_hms(localtime),
         localtime = round(localtime),
         localtime = as_hms(localtime))
df1
#   localtime
# 1  09:10:57
# 2  12:05:01
# 3  16:01:01
0Like

Comments

  1. @kiina

    Questioner

    ご回答をいただき、ありがとうございました。解決いたしました。エラーとなった理由もよく分かりました。二つ目に提案して頂いた「もともとのlocaltimeを置き換える」方が簡潔ですね。

    出来上がったcsvファイルを確認すると、B列に新たな列(列名X)が追加されてしまうのですが、これを追加しないようにすることはできるでしょうか? %>% select(-X)を追加する以外の方法があれば教えて頂けると幸いです。本来の質問のからずれてしまい申し訳ありませんが、よろしくお願いいたします。
  2. localtimeを置き換えるやり方であれば,余計な列ができないはずですので,何か作業をおこなってしまったデータフレームに追加で作業してしまった可能性が考えられます.

    いったんrm(list=ls())などでオブジェクトを初期化して,csvファイルの読み込みから実行してみてはどうでしょうか.
  3. @kiina

    Questioner

    アドバイスありがとうございます。rm(list=ls())などでオブジェクトを初期化しても、Rを再起動しても、やはりB列に新たな列(列名X)が追加されてしまいます。原因はよく分かりませんが、%>% select(-X)を追加する方法で対処したいと思います。

    この度は、迅速にご対応いただき、誠にありがとうございました。本当に助かりました(感謝)。

Your answer might help someone💌