2016-08-12 4 views
2

これは私が特定のバッチが最高のスコアを持っている行を特定したら、私のデータフレームが連結し、

library(data.table) 

    dt <- fread(' 
     Batch Score Type  Description 
     A   1 fruit   apple 
     A   2 beverage  pepsi 
     A   3 food   rice 
     B   1 beverage  coke 
     B   2 fruit   banana 
     C   1 food   butter 
     D   1 food   bread 
    ') 

次のようになります/ data.tableデータフレーム内の改行を使用して2つの列を貼り付け、私がしたいです改行の間でタイプと説明の間にギャップを使用して、TypeDescriptionを連結して(最初の行から最高のスコアを持つ最後の行までのすべての要素)貼り付けます。それは次のように見えるように貼り付けがそのバッチのための最高のスコアを行件まで行われます。

Batch Score(Max)  Description2 
    A   3  fruit  apple 
         beverage pepsi 
         food  rice       
    B   2  beverage coke 
         fruit  banana      
    C   1  food  butter 
    D   1  food  bread 

行バッチの最高得点はまた私にそのバッチの最後の行であることを起こるとデータフレーム。私が試してみました:

dt[, .(MaxScore = max(Score), 
Description2 = cat(paste(Type, Description), sep="\n")),by = .(Batch)] 

目標は1列(説明2)と各batch.Yourヘルプの1行のすべての情報が高く評価されて表示することです!

答えて

3

注:これは、OPの質問に完全には答えていません。


私は似た(しかし全く同じではない)何かを:

print(x=dt[,{ 
mx = max(Score) 

subdat = .SD[, !"Score", with=FALSE] 
newrow0 = lapply(subdat, function(x) as("",class(x))) 
newrow = newrow0 
newrow[length(newrow)] = paste0(" Max Score: ", mx) 
rbind(
    subdat, 
    newrow, 
    newrow0 
) 
}, by=Batch], nrows=Inf, row.names=FALSE) 

私はちょうどコンソールでデータを確認するためにこれを使用

Batch  Type Description 
    A fruit   apple 
    A beverage   pepsi 
    A  food   rice 
    A   Max Score: 3 
    A      
    B beverage   coke 
    B fruit  banana 
    B   Max Score: 2 
    B      
    C  food  butter 
    C   Max Score: 1 
    C      
    D  food   bread 
    D   Max Score: 1 
    D      

を与えます。グループのメタデータを列の代わりに一行に置きます。これは、既に画面全体に十分な数の列があるためです。

as("", class(x))は非常に信頼性が低い(例:Dateクラスでは動作しません)。テーブル全体を最初に文字列に変換する必要があるかもしれません。一つとして、複数の列を印刷するための


sprintfを使用します。

print(x=dt[,{ 
mx = max(Score) 
subdat = .(
    Description = as.character(Description), 
    Type = as.character(Type) 
) 
.(mx, sprintf("%10s %15s", subdat$Type, subdat$Description)) 
}, by=Batch], nrows=Inf, row.names=FALSE) 

Batch V1       V2 
    A 3  fruit   apple 
    A 3 beverage   pepsi 
    A 3  food   rice 
    B 2 beverage   coke 
    B 2  fruit   banana 
    C 1  food   butter 
    D 1  food   bread 

これは非常にマニュアルですが、それはsapply(dt, function(x) max(nchar(x)))で始まる、より多くのプログラムで行うことができる方法を明らかにする必要があります。

+0

フランクにお答えいただきありがとうございます。その情報をすべて1つの列(Description2)にまとめる理由は、そのフィールドをsalesforceにエクスポートしようとしているからです。 Salesforceのレポートはかなり悪く、その領域外のデータではうまくいきません。 1つのフィールドを作成することで、すべての情報を読み込み可能な形式で表示し、それをsalesforceにアップロードできるようにすることを考えていました。 – gibbz00

+0

お元気ですか?あなたの出力をデータフレームに強制するにはどうすればいいですか?そして、最終的な出力からMax Scoreをどのように取り出すことができますか?その部分は必要ありません。 – gibbz00

+1

@gibbz「最大得点」部分は 'newrow'に現れます。そのため、最後の' rbind'からその部分を除外します。 data.frameが必要な場合は 'as.data.frame'を使用してください。あなたは改行などについて言及しました。これは、あなたがテキスト出力の後ろにいるように私には響きました、おそらくfwfでインポートしていました。 – Frank