2016-09-13 8 views
1

RPostgreSQLを使用してPostgres DBからデータを取得していますが、これはRへのインポート時にタイムゾーンをシステムタイムゾーンにキャストします。すべてのタイムスタンプのゾーンをUTCに設定します。mutate_ifとforce_tzを使用するすべてのタイムスタンプでタイムゾーンを変更

df %>% 
    mutate_if(lubridate::is.POSIXct, lubridate::force_tz(., tzone='UTC')) -> df 

しかし、これは私が明らかにmutate_if()誤っ

+1

ドット表記法を使用するには、関数を 'funs'でラップする必要があります。しかし、[githubのこの問題](https://github.com/hadley/dplyr/issues/2089)では、 '::'を使わずに実際にパッケージをロードする必要があります。 – aosmith

+0

@aosmith答えとして提出したいですか? – RoyalTS

答えて

1

mutate_ifでドット表記を使用するには、関数をfunsにラップする必要があります。

library(lubridate) 

df %>% 
    mutate_if(is.POSIXct, funs(force_tz(., tzone='UTC'))) 

現在、しかし、あなたはfunspackage::表記を使用することはできません。代わりに、上記のようにパッケージを明示的に読み込む必要があります(関連するgithubの問題here)。

2

この作品を使用してい

Error in UseMethod("as.fun_list") : 
    no applicable method for 'as.fun_list' applied to an object of class "data.frame" 

をスロー:私はそうのように、私はエレガントdplyrlubridateを使用してこれを行うことができるだろうと思いました

df %>% 
    dplyr::mutate_if(lubridate::is.POSIXct, 
        function(x) lubridate::force_tz(x, tzone='UTC')) -> df 

同様にpurrrソリューション:

df %>% 
    purrr::map_if(lubridate::is.POSIXct, 
       ~ lubridate::force_tz(., tzone='UTC')) %>% 
    as_data_frame -> df 

これは優雅なものですか?

+0

私はそう思う傾向がある、はい。 –

関連する問題