0

以下のような data.frame があります。

toolid          startdate       enddate         stage
abc                 1-Jan-13    5-Jan-13    production
abc                 6-Jan-13    10-Jan-13   down
xyz                 3-Jan-13    8-Jan-13    production
xyz                 9-Jan-13    15-Jan-13   down

data.frame を以下の形式に変換したい。'startdate'列と'enddate'上記の data.frame を以下と呼ばれる単一の列に結合しようとしてい'date'ます。toolids私が持っている元のデータには、多くの段階にわたって数千行以上あります。私はすでに SQL を使用してこれを行う方法を見つけましたが、R ソリューションを好むでしょう。以下のコードに示すように、データを溶かすことから始めました。

toolid  date            stage
abc     1-Jan-13    production
abc     2-Jan-13    production
abc     3-Jan-13    production
abc     4-Jan-13    production
abc     5-Jan-13    production
abc     6-Jan-13    down
abc     7-Jan-13    down
abc     8-Jan-13    down
abc     9-Jan-13    down
abc     10-Jan-13   down
xyz     3-Jan-13    production
xyz     4-Jan-13    production
xyz     5-Jan-13    production
xyz     6-Jan-13    production
xyz     7-Jan-13    production
xyz     8-Jan-13    production
xyz     9-Jan-13    down
xyz     10-Jan-13   down
xyz     11-Jan-13   down
xyz     12-Jan-13   down
xyz     13-Jan-13   down
xyz     14-Jan-13   down
xyz     15-Jan-13   down

Rコード

startdate=c('1-Jan-13','6-Jan-13','3-Jan-13','9-Jan-13')
enddate=c('5-Jan-13',    '10-Jan-13',   '8-Jan-13', '15-Jan-13')
toolid=c('abc',     'abc',  'xyz',  'xyz')
stage=c('production',    'down',    'production',   'down')
data=data.frame(toolid,startdate,enddate,stage)
require(reshape2)
newdata=melt(data,id.vars=c('toolid','stage'))

更新:以下の@ Ananda Mahtoの回答からのコードに対処し、数行のコードを追加して、ピボットテーブルのような出力を提供します

## Convert "startdate" and "enddate" to date objects
data$startdate <- as.Date(data$startdate, format="%d-%b-%y")
data$enddate <- as.Date(data$enddate, format="%d-%b-%y")


## Use `seq` to create the date sequence, and manually recreate
##   your dataframe. `do.call(rbind, ...) to put it back together
ddd=do.call(rbind, lapply(sequence(nrow(data)), function(x) {
  data.frame(toolid = data$toolid[x], 
             date = seq(data$startdate[x], data$enddate[x], by = 1),
             stage = data$stage[x])
}))

ddd


   toolid       date      stage
1     abc 2013-01-01 production
2     abc 2013-01-02 production
3     abc 2013-01-03 production
4     abc 2013-01-04 production
5     abc 2013-01-05 production
6     abc 2013-01-06       down
7     abc 2013-01-07       down
8     abc 2013-01-08       down
9     abc 2013-01-09       down
10    abc 2013-01-10       down
11    xyz 2013-01-03 production
12    xyz 2013-01-04 production
13    xyz 2013-01-05 production
14    xyz 2013-01-06 production
15    xyz 2013-01-07 production
16    xyz 2013-01-08 production
17    xyz 2013-01-09       down
18    xyz 2013-01-10       down
19    xyz 2013-01-11       down
20    xyz 2013-01-12       down
21    xyz 2013-01-13       down
22    xyz 2013-01-14       down
23    xyz 2013-01-15       down

ddd1=dcast(ddd,date~stage)


ddd1
         date down production
1  2013-01-01    0          1
2  2013-01-02    0          1
3  2013-01-03    0          2
4  2013-01-04    0          2
5  2013-01-05    0          2
6  2013-01-06    1          1
7  2013-01-07    1          1
8  2013-01-08    1          1
9  2013-01-09    2          0
10 2013-01-10    2          0
11 2013-01-11    1          0
12 2013-01-12    1          0
13 2013-01-13    1          0
14 2013-01-14    1          0
15 2013-01-15    1          0
4

1 に答える 1

4

これを行うにはもっと「正しい」方法があると確信していますが、これがすぐに思い浮かびました。

まず、「startdate」と「enddate」を日付オブジェクトに変換します

data$startdate <- as.Date(data$startdate, format="%d-%b-%y")
data$enddate <- as.Date(data$enddate, format="%d-%b-%y")

次に、 を使用seqして日付シーケンスを作成し、手動で を再作成しますdata.frame。`do.call(rbind, ...) を使用して元に戻します。

ddd <- do.call(rbind, lapply(sequence(nrow(data)), function(x) {
  data.frame(toolid = data$toolid[x], 
             date = seq(data$startdate[x], data$enddate[x], by = 1),
             stage = data$stage[x])
}))
ddd
#    toolid       date      stage
# 1     abc 2013-01-01 production
# 2     abc 2013-01-02 production
# 3     abc 2013-01-03 production
# 4     abc 2013-01-04 production
# 5     abc 2013-01-05 production
# 6     abc 2013-01-06       down
# 7     abc 2013-01-07       down
# 8     abc 2013-01-08       down
# 9     abc 2013-01-09       down
# 10    abc 2013-01-10       down
# 11    xyz 2013-01-03 production
# 12    xyz 2013-01-04 production
# 13    xyz 2013-01-05 production
# 14    xyz 2013-01-06 production
# 15    xyz 2013-01-07 production
# 16    xyz 2013-01-08 production
# 17    xyz 2013-01-09       down
# 18    xyz 2013-01-10       down
# 19    xyz 2013-01-11       down
# 20    xyz 2013-01-12       down
# 21    xyz 2013-01-13       down
# 22    xyz 2013-01-14       down
# 23    xyz 2013-01-15       down

最後に、最終的に行きたいと言っている場所を見て、ベース R にずっと固執して を使用できますtable。結果としてas.data.frame.matrix()a が必要であると想定したため、それを入れました。data.frame

as.data.frame.matrix(table(ddd[-1]))
#            down production
# 2013-01-01    0          1
# 2013-01-02    0          1
# 2013-01-03    0          2
# 2013-01-04    0          2
# 2013-01-05    0          2
# 2013-01-06    1          1
# 2013-01-07    1          1
# 2013-01-08    1          1
# 2013-01-09    2          0
# 2013-01-10    2          0
# 2013-01-11    1          0
# 2013-01-12    1          0
# 2013-01-13    1          0
# 2013-01-14    1          0
# 2013-01-15    1          0
于 2013-09-06T16:28:25.630 に答える