2016-07-06 3 views
2

dplyrのデータフレームは、100k +行と〜200個のカラムを持ちます。 Excel形式の日付値(1900年1月1日以降の日数)を含む約15列の列があり、列名にはdate文字列が含まれているため、データフレームのサブセット化がかなり容易になります。mutate_eachを使用してdfのサブセットを更新します。

library(dplyr) 

x <- data.frame(date1 = 45000+ 500*rnorm(100), 
      date2 = 50000+ 500*rnorm(100), 
      var1 = 50 * rnorm(100), 
      var2 = 100 + 20 * rnorm(100)) 

> x %>% head 
    date1 date2  var1  var2 
1 44952.83 49432.88 8.125523 125.95802 
2 44331.47 49231.76 -34.814162 117.26881 
3 44597.69 49651.91 27.747881 108.45787 
4 45113.50 49802.87 24.584569 83.84904 
5 46212.14 49972.59 72.444414 80.61595 
6 45753.38 50074.57 -34.927552 127.70018 

date_cols <- x %>% select(contains('date', ignore.case=T)) %>% names 
> date_cols 
[1] "date1" "date2" 

私は、他の列を変更することなく、実際のR日付時刻にこれらの日付列を変更したいと思います。動作しません、私は次のことを試してみた

x %>% select_(.dots = date_cols) %>% 
     mutate_each(funs(as.Date(., origin="1900-01-01"))) %>% 
     head 

     date1  date2 
1 2023-01-28 2035-05-05 
2 2021-05-17 2034-10-16 
3 2022-02-07 2035-12-10 
4 2023-07-08 2036-05-09 
5 2026-07-11 2036-10-26 
6 2025-04-08 2037-02-05 

x %>% select_(.dots = date_cols) <- x %>% select_(.dots = date_cols) %>% 
    mutate_each(funs(as.Date(., origin="1900-01-01"))) 

を私は良くあり推測私はちょうど私のデータフレームの唯一date_colsサブセットを更新する方法を見つけ出すことはできません元のデータフレームを「rbinding」する方法は、date_colsサブセットが一度変更された日付列を使用しないでください。

+0

'funs'の後に' mutate_each'の列を指定することができます。新しい(0.5.0) 'mutate_at'と' mutate_if'も見てください。 – alistaire

答えて

1

としては、あなただけのこれらのdate列を変換するためにmutate_atを使用して、サブセットと元のデータフレームを結合避けることができるように、そのままデータフレームの残りの部分を維持することができ、@alistaireコメント:

library(dplyr) 
muX <- x %>% mutate_at(vars(contains('date')), funs(as.Date(., origin="1900-01-01"))) 

head(muX) 
#  date1  date2  var1  var2 
# 1 2021-11-09 2038-10-20 44.524710 86.15957 
# 2 2020-06-04 2037-08-04 31.402905 94.74633 
# 3 2023-12-22 2038-03-06 31.600929 85.90605 
# 4 2020-05-08 2037-01-02 7.140777 82.80565 
# 5 2025-03-25 2038-07-30 -54.913577 100.83949 
# 6 2021-02-18 2034-06-20 28.616670 93.92246 

そしてまた?mutate_atに従って:

summarise_each()とmutate_each()将来的に 廃止される予定の古い変異体です。

これらの新しいAPIによく慣れてください。

+0

ありがとう!私はあなたの答えを受け入れるつもりですが、パイプラインで( '.'演算子を使って)動作し、' date_cols'を明示的に定義することなく構文を与えることができれば本当に感謝していますか?私は試したが役に立たない。 – jodoox

+0

これはかなり新しい機能です。私はまだ多くの実験をしていませんが、試してみることができます。 – Psidom

+1

多分このような何か。 'muX <- x %>%mutate_at(grep( 'date'、names(。)、value = T)、funs(as.Date(。、origin =" 1900-01-01 ")))'最高ではないが、 。 – Psidom

関連する問題