2016-10-30 3 views
-4

データが同じ列のグループヘッダーと散在しているときにデータをグループ化する方法はありますか?基本的に、私のデータは、間の行の一貫性のない数字で日ごとにグループ化され

16-Oct-16 
Name1 
Name2 
Name3 
17-Oct-16 
Name1 
Name2 
Name3 
Name4 
Name5 
19-Oct-16 

など

私はグループのデータを取得し、子レコードに適用できるようにする必要があります。 ようになります期待される結果は次のとおりです。私はdata.tableを使用していますが、現在、私はループ以外の任意の方法を考えることはできません

Name1 16-Oct-16 
Name2 16-Oct-16 
Name3 16-Oct-16 
Name1 17-Oct-16 
Name2 17-Oct-16 
Name3 17-Oct-16 
Name4 17-Oct-16 
Name5 17-Oct-16 

。私は、各行が名前を有する場合、それぞれの名前の列に適切な日付フィールドをコピーして、きちんとしたデータセットで終わるしたい

data.table(c('October 16, 2016', paste0('Name',1:4), 
      'October 17, 2016', paste0('Name',1:12), 
      'October 20, 2016', paste0('Name',1:2), 
      'October 25, 2016', paste0('Name',1:6))) 

次のスクリプトは、私が見ていたデータセットの種類を生成し、と日付。

+0

がどのように現実の世界で最初にこのデータを得るのですか?これは、あなたのデータセットをRにロードする前に、あなたのデータセットを配置するのに最適なツールになるでしょうか? – Tensibai

+0

あなたのサンプルデータをより正確にして、あなたの期待される結果はどうですか?あなたの質問を改善する方法についてのguielinesについては、[ask]と[再現可能な例を与える方法](http://stackoverflow.com/questions/5963269) – Jaap

+0

[reproducible](https://stackoverflow.com/questions)を参照してください。/5963269/how-to-make-a-great-r-reproducible-example)の例が役に立ちます。 – Henk

答えて

1

同様の状況で使用したdata.tableソリューションがあります。 (私はdata.tableバージョン1.9.7でテストしてみた。しかし、それはCRANバージョン1.9.6でも動作するはずです)前方

グループヘッダーがある運ば

データの読み取り

library(data.table) 

dt <- fread("16-Oct-16 
      Name1 
      Name2 
      Name3 
      17-Oct-16 
      Name1 
      Name2 
      Name3 
      Name4 
      Name5 
      19-Oct-16", 
      header = FALSE) 
print(dt) 
      V1 
1: 16-Oct-16 
2:  Name1 
3:  Name2 
4:  Name3 
5: 17-Oct-16 
6:  Name1 
7:  Name2 
8:  Name3 
9:  Name4 
10:  Name5 
11: 19-Oct-16 

最終観察日付。だから、lubridateパッケージのdmy機能を使用して、できる限り日付形式に強制しました。日付としてフォーマットされていない行の場合、dmyNAを作成します。パッケージzooからna.locfを使用して、最後の非NA観察が繰り越される。両方の操作は、ワンライナーで組み合わせることができる。

dt[, day := zoo::na.locf(lubridate::dmy(V1))] 
print(dt) 
      V1  day 
1: 16-Oct-16 2016-10-16 
2:  Name1 2016-10-16 
3:  Name2 2016-10-16 
4:  Name3 2016-10-16 
5: 17-Oct-16 2016-10-17 
6:  Name1 2016-10-17 
7:  Name2 2016-10-17 
8:  Name3 2016-10-17 
9:  Name4 2016-10-17 
10:  Name5 2016-10-17 
11: 19-Oct-16 2016-10-19 

(Iローリング代わりna.locfの加入使用速いバージョンがある推測)

は、グループを削除するにはグループヘッダ行を

を削除します一時的な列を保持する必要があるヘッダー。

dt[, tmp := lubridate::dmy(V1)][, day := zoo::na.locf(tmp)] 
print(dt) 
      V1  tmp  day 
1: 16-Oct-16 2016-10-16 2016-10-16 
2:  Name1  <NA> 2016-10-16 
3:  Name2  <NA> 2016-10-16 
4:  Name3  <NA> 2016-10-16 
5: 17-Oct-16 2016-10-17 2016-10-17 
6:  Name1  <NA> 2016-10-17 
7:  Name2  <NA> 2016-10-17 
8:  Name3  <NA> 2016-10-17 
9:  Name4  <NA> 2016-10-17 
10:  Name5  <NA> 2016-10-17 
11: 19-Oct-16 2016-10-19 2016-10-19 

dt <- dt[is.na(tmp)] 
print(dt) 
     V1 tmp  day 
1: Name1 <NA> 2016-10-16 
2: Name2 <NA> 2016-10-16 
3: Name3 <NA> 2016-10-16 
4: Name1 <NA> 2016-10-17 
5: Name2 <NA> 2016-10-17 
6: Name3 <NA> 2016-10-17 
7: Name4 <NA> 2016-10-17 
8: Name5 <NA> 2016-10-17 

dt[, tmp := NULL] 
print(dt) 
     V1  day 
1: Name1 2016-10-16 
2: Name2 2016-10-16 
3: Name3 2016-10-16 
4: Name1 2016-10-17 
5: Name2 2016-10-17 
6: Name3 2016-10-17 
7: Name4 2016-10-17 
8: Name5 2016-10-17 
1

もう1つのオプションは、正規表現パターンを使用することです。

library(data.table) 
library(zoo) 
dt1[grep('([0-9]{1,2})-([A-Za-z]+)-(\\d{2})', V1), V2 := V1 
    ][, V2 := na.locf(V2)][V1!=V2] 

います:最初の例のデータセットについて

 V1  V2 
1: Name1 16-Oct-16 
2: Name2 16-Oct-16 
3: Name3 16-Oct-16 
4: Name1 17-Oct-16 
5: Name2 17-Oct-16 
6: Name3 17-Oct-16 
7: Name4 17-Oct-16 
8: Name5 17-Oct-16 

を第二のデータセットの場合は、あなたが使用することができます。

 V1    V2 
1: Name1 October 16, 2016 
2: Name2 October 16, 2016 
3: Name3 October 16, 2016 
4: Name4 October 16, 2016 
5: Name1 October 17, 2016 
6: Name2 October 17, 2016 
7: Name3 October 17, 2016 
8: Name4 October 17, 2016 
9: Name5 October 17, 2016 
10: Name6 October 17, 2016 
11: Name7 October 17, 2016 
12: Name8 October 17, 2016 
13: Name9 October 17, 2016 
14: Name10 October 17, 2016 
15: Name11 October 17, 2016 
16: Name12 October 17, 2016 
17: Name1 October 20, 2016 
18: Name2 October 20, 2016 
19: Name1 October 25, 2016 
20: Name2 October 25, 2016 
21: Name3 October 25, 2016 
22: Name4 October 25, 2016 
23: Name5 October 25, 2016 
24: Name6 October 25, 2016 

:与え

dt2[grep('([A-Za-z]+)([0-9]{1,2}[,])(\\d{4})', V1), V2 := V1 
    ][, V2 := na.locf(V2)][V1!=V2] 

使用するデータ:

dt1 <- fread("16-Oct-16 
      Name1 
      Name2 
      Name3 
      17-Oct-16 
      Name1 
      Name2 
      Name3 
      Name4 
      Name5 
      19-Oct-16", header = FALSE) 

と:

dt2 <- data.table(c('October 16, 2016', paste0('Name',1:4), 
        'October 17, 2016', paste0('Name',1:12), 
        'October 20, 2016', paste0('Name',1:2), 
        'October 25, 2016', paste0('Name',1:6))) 
関連する問題