2017-09-21 5 views
0

2人の間のチャットの会話を含むデータセットがあります。私はデータセットを結合してPerson 1とPerson 2の行ごとの会話にしたいと思っています。特定の列のdplyr行を結合または反復する

人は複数の文章を入力することがあり、データフレーム内で複数のレコードとして表示されることがあります。

これは私が把握しようとしている疑似コードです。

  • line_textは、最新の時間
  • で更新されるように
  • タイムスタンプを組み合わせることするならば、同一人物が複数行で入力し、複数のIDのがあるので が自分のチャット
  • を介して送信されline_byショーこのデータセットでは、人1と人2の間でそれぞれ 会話記録を意味するので、私は ループを各一意のIDで実行したいと考えています。

これは、データフレームが今のように見えるということです。

id timestamp line_by line_text 
1234 02:54.3 Person1 Text Line 1 
1234 03:23.8 Person2 Text Line 2 
1234 03:47.0 Person2 Text Line 3 
1234 04:46.8 Person1 Text Line 4 
1234 05:46.2 Person1 Text Line 5 
9876 06:44.5 Person2 Text Line 6 
9876 07:27.6 Person1 Text Line 7 
9876 08:17.5 Person2 Text Line 8 
9876 10:20.3 Person2 Text Line 9 

私は、データが次のように変更することが見てみたい:

id timestamp line_by line_text 
1234 02:54.3 Person1 Text Line 1 
1234 03:47.0 Person2 Text Line 2Text Line 3 
1234 05:46.2 Person1 Text Line 4Text Line 5 
9876 06:44.5 Person2 Text Line 6 
9876 07:27.6 Person1 Text Line 7 
9876 10:20.3 Person2 Text Line 8Text Line 9 

開示:私は同じことを求めています質問はPythonのpandasのために。これは私がRとPythonの両方で立ち往生しているところです。

+0

2番目のデータフレーム(希望するもの)のように見えますが、id 1234 Person 2の場合はタイムラインが正しく表示されません(03:23.8で、03:47.0と表示されます)。私はあなたがここで探しているパターンを理解しているかどうかわかりません... –

答えて

1

だけdplyr使用して、この

library(dplyr) 
library(data.table) 
df %>% 
    group_by(id, grp = rleid(line_by)) %>% 
    summarise(timestamp = last(timestamp), 
      line_by = unique(line_by), line_text = paste(line_text, collapse=", ")) %>% 
    select(-grp) 

トリックはid

出力

# A tibble: 6 x 4 
# Groups: id [2] 
    # id timestamp line_by   line_text 
    # <int>  <chr> <chr>    <chr> 
# 1 1234 02:54.3 Person1   TextLine1 
# 2 1234 03:47.0 Person2 TextLine2, TextLine3 
# 3 1234 05:46.2 Person1 TextLine4, TextLine5 
# 4 9876 06:44.5 Person2   TextLine6 
# 5 9876 07:27.6 Person1   TextLine7 
# 6 9876 10:20.3 Person2 TextLine8, TextLine9 
+0

'dplyr'が独自のバージョンの' rleid'を持っていたら、私はこの質問に答えることを始めましたが、 1つ書く! – Marius

+0

合意しました............... – CPak

+0

ありがとうございます。これは完璧な仕事です。 – treeof

1

変動に加えてrleid(...)によってグループにある試してみてください。

library(dplyr) 
df %>% group_by(id,line_by,grp = cumsum(line_by !=lag(line_by,1,""))) %>% 
    summarise(timestamp = last(timestamp),line_text = paste(line_text,collapse="")) %>% 
    select(-grp) 
関連する問題