質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

2492閲覧

R言語:DataFrame中の連続したデータでグループ化したい

退会済みユーザー

退会済みユーザー

総合スコア0

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

1クリップ

投稿2018/11/07 07:42

編集2018/11/07 08:22

R言語のDataFrameの処理についての質問になります。
以下に示しますDF1をDF2に変換したいです。
変換するためのよい方法、コードをご教示いただけないでしょうか?
※なお、実際の処理対象のDataFrameは約30万レコードになります。

【DF1】

IDplacedatetool
001A2018/10/01XXX
001A2018/10/02XXX
001A2018/10/03XXX
001A2018/10/04YYY
001A2018/10/05YYY
001A2018/10/06XXX
001A2018/10/07XXX

【DF2】

IDplacestart_dateend_datetool
001A2018/10/012018/10/03XXX
001A2018/10/042018/10/05YYY
001A2018/10/062018/10/07XXX

【処理内容】
ID,place,toolが同一の連続したレコードのまとまりを1つのグループとみなし、
グループ中で最も古いdateをstart_date、最も新しいdateをend_dateとします。
ex) 10/01~03のグループの場合、start_dateは10/01、end_dateは10/03となります。
なお、10/01~03のグループと10/06~07のグループはID,place,toolが同一ですが
日付が連続していないので、別々のグループとみなします。

【補足】

# DF1→DF2への変換 library(dplyr) DF2 <- DF1 %>% group_by(ID, place, tool) %>% mutate(start_date = min(date)) %>% mutate(end_date = max(date)) %>% distinct(ID, place, start_date, end_date, tool)

上記のようなコードを書いた場合、以下のようにID,place,toolが同一のレコードで
まとまってしまうため、そうならないための方法を探しています。

IDplacestart_dateend_datetool
001A2018/10/012018/10/07XXX
001A2018/10/042018/10/05YYY

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

R

1library(dplyr) 2 3DF1$date <- DF1$date %>% as.Date() 4DF1$number <- c(1:nrow(DF1)) 5 6DF1_semi <- DF1 %>% 7 mutate(ID_lead = lead(ID, default = "UA"), 8 place_lead = lead(place, default = "UA"), 9 tool_lead = lead(tool, default = "UA"), 10 ID_lag = lag(ID, default = "UA"), 11 place_lag = lag(place, default = "UA"), 12 tool_lag = lag(tool, default = "UA") 13 ) %>% 14 mutate(flg_end = ifelse((ID == ID_lead & place == place_lead & tool == tool_lead), 0, 1), 15 flg_start = ifelse((ID == ID_lag & place == place_lag & tool == tool_lag) , 0, 1), 16 tmp = ifelse((flg_start == 0 & flg_end == 0), 0, 1) 17 ) %>% 18 filter(tmp == 1) %>% 19 arrange(number) %>% 20 select(number, ID, place, date, tool, flg_start, flg_end) 21 22DF2 <- DF1_semi %>% 23 group_by(ID, place, tool) %>% 24 mutate(date_lead = as.Date(ifelse(is.na(lead(date)), date, lead(date)), origin="1970-01-01")) %>% 25 ungroup() %>% 26 filter(flg_start == 1) %>% 27 rename(start_date = date, end_date = date_lead) %>% 28 arrange(number) %>% 29 select(ID, place, start_date, end_date, tool) %>% 30 as.data.frame()

投稿2018/11/08 06:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/08 06:03

有識者に情報提供いただき、解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問