GNU R は不慣れなので rep() 関数を使って無理やり戻すと以下のような感じ。
大量にフィールド数がある場合、手書きすると死ねるので、もう少し簡単に書けんものかと思うが、とりあえず今回はこれでお茶を濁しておく。
Titanic.dffreq=as.data.frame(Titanic)
Titanic.df=data.frame(
Class =rep(Titanic.dffreq[,"Class" ],Titanic.dffreq[,"Freq"]),
Sex =rep(Titanic.dffreq[,"Sex" ],Titanic.dffreq[,"Freq"]),
Age =rep(Titanic.dffreq[,"Age" ],Titanic.dffreq[,"Freq"]),
Survived=rep(Titanic.dffreq[,"Survived"],Titanic.dffreq[,"Freq"])
)
> Titanic.dffreq
Class Sex Age Survived Freq
1 1st Male Child No 0
2 2nd Male Child No 0
...
32 Crew Female Adult Yes 20
> Titanic.df
Class Sex Age Survived
1 3rd Male Child No
2 3rd Male Child No
...
2201 Crew Female Adult Yes
2019-01-25: 追記
Map() と無名関数を使うと以下のように書けた。
Titanic.dffreq=as.data.frame(Titanic)
Titanic.df=data.frame(Map(function(x) rep(x, Titanic.dffreq[,5]), Titanic.dffreq[,1:4]))
データフレームに対して Map() を用いると、行列が転置したリストになるので、改めてデータフレームに直してやる必要がある。
1:4 と 5 はデータのフィールド数に依存するので、差集合を求める setdiff(x,y) 関数を用いて以下のように書いた方が良いだろう。
Titanic.dffreq=as.data.frame(Titanic)
Titanic.df=data.frame(Map(function(x) rep(x, Titanic.dffreq[,"Freq"]), Titanic.dffreq[,setdiff(names(Titanic.dffreq),"Freq")]))
ここで、names() はフィールド名を得る関数、setdiff() は差集合を得る関数。
ただ、これでは、ぱっと見、何やってるかがよくわからない。
"Freq" フィールドを落とした上で、各行を "Freq" フィールドの回数重複させる、関数 deFreq(x) を作ったほうが分かり易いだろう。
deFreq = function(x) as.data.frame(Map(function(y) rep(y,x[,"Freq"]), x[,setdiff(names(x),"Freq")]))
Titanic.df = deFreq(as.data.frame(Titanic))