2017-04-05 3 views
0

複数の列を持つデータフレームがあります。そのうちのいくつかはchronを使用して 'time'クラスに変更する必要があります。基本的な統計。これらの列は現在、文字として保存され、hh:mmのように書式設定されています。データフレームの複数の列をクラス '文字'からクラス '時間'に変更する

ここ
> Data 
    DATE FLT TYPE REG AC DEP ARR STD STA ATD ATA 
1 15-01-02 953 J C-GCPT 73M YVQ YEV 12:00 12:55 13:00 13:59 
2 15-01-04 953 J C-GCPT 73M YVQ YEV 12:00 12:55 13:17 14:13 
3 15-01-05 953 J C-GCPT 73M YVQ YEV 12:00 12:55 13:20 14:14 

Time_list <-c("STD","STA","ATD","ATA") 

私は1つの列のみを変更するためにやっていることである(そしてそれが動作します):ここで

はそれのサブセットと同様に変更する必要がある列のリストである

Data$ATA <- paste0(Data$ATA, ':00') 
    Data$ATA<-chron(times.=Data$ATA) 

    class(Data$ATA) 
    [1] "times" 

しかし、多くの列が存在するので、すべての列を同時に実行できるようにすることをお勧めします。私は複数のテクニックを試しましたが、いくつかは最初のパートでは ':00'を貼り付けているようですが、2番目のパートでは常にchronを使って間違っています。私はforループ

を使用して apply

YEVdata[,(Time_list)] <- lapply(YEVdata[,(Time_list)], paste0,':00') 
Data[,(Time_list)] <- lapply(Data[,(Time_list)], chron, times. =Data[,(Time_list)]) 
**Error in FUN(X[[i]], ...) : 
    X[[i]] and Data[, (Time_list)] must have equal lengths** 
  • を使用してdmap

    Data[,Time_list]<- 
        Data%>% 
        select(one_of(Time_list)) %>% 
        dmap(paste0,':00') 
    
    Data[,Time_list]<- 
        Data %>% 
        select(one_of(Time_list)) %>% 
        dmap(chron,times.=Data[,Time_list]) 
    
    **Error in .f(.d[[i]], ...) : 
        .d[[i]] and Data[, Time_list] must have equal lengths** 
    
  • を使用して、私は

    1. を理解していない長さの問題を持っているように見えます

      私はforループを使ってみましたが、私はちょっと初心者でどこにでも行くことができました。

      1. 別のスタックオーバーフローの質問から「シンプルな」ソリューションを使用する。

      ちょうど混乱を招き、貼り付けてしまった。

      Efficiently transform multiple columns of a data frame

      平易初心者言語での任意のアイデアは非常に高く評価されるだろう!両方の操作をネストすることができれば、それはさらに良いでしょう!

  • +0

    基本的な古い 'lapply'はそれを行う必要があります - 'データ[Time_list] < - lapply(データ[Time_list]、機能(x)の回(paste0(データ$ ATA、 ":00"))) ' – thelatemail

    +0

    Joshのリンクされた質問の回答と本質的に同じです - http://stackoverflow.com/a/17453493/496803 - 'lapply(...' – thelatemail

    +0

    @thelatemailを開始した行、私はそれを試みましたが、まだエラーが出ます:データのエラー$ ATA:オブジェクト型の閉鎖は不可能 – lcabral

    答えて

    0

    dplyr::mutate_atこの状況では機能します。変更する変数を定義し、使用する関数を定義します。

    .の表記法と入れ子関数を使用して、funsの1ステップで貼り付けと変換を行うことができます。

    library(dplyr) 
    Data = mutate_at(Data, Time_list, funs(chron(times. = paste0(., ":00")))) 
    
    +0

    大変お手伝いしてくれたありがとうございました!私の時間欄の中には実際に "h:mm"形式で書かれているものがありますOR "hh:mm"(列にもNAsがあります)このようにして、私はこれを行いました: 'Data = mutate_at(Data、Delays、funs(chron(times. = paste0(" 0 "、。、 ":00"))))エラーメッセージが表示されても、動作しているように見えました(未処理(sep = fmt $ sep、fnames = fmt $ periods、nfields = 3): フィールド数が間違っていますin entry(ies)1,2)しかし、if/else文を追加する方法については頭を悩ますことはできません。これは、IF長さ<4のようになります。先頭に0をペーストします。それ以外の場合は、「00」をペーストします。何か案は? – lcabral

    +0

    @lcabral 'chron'は、時間の先頭に0を付けずに私のために働くように見えます。それらを追加する必要がある場合、 'nchar'は' ifelse'ステートメントに役立ちます。 – aosmith

    関連する問題