2016-08-12 5 views
2

Dies ist, was mein Datenrahmen wieVerketten und Einfügen zwei Spalten mit Zeilenumbrüchen innerhalb von Datenrahmen/data.table

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 
    ') 

sieht Sobald ich die Zeile, in der eine bestimmte Charge hat die höchste Punktzahl zu identifizieren, mag ich verketten Sie Type und Description und fügen Sie sie den ganzen Weg (alle Elemente von der ersten Zeile bis zur letzten Zeile mit dem höchsten Score) mit Zeilenumbrüche und Lücke zwischen Typ und Beschreibung. Das Einfügen wird bis zu der Zeile mit der höchsten Punktzahl für diese Charge getan, so dass es wie folgt aussieht:

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 

Die Zeile mit der höchsten Punktzahl für die Charge auch in die letzte Reihe für diesen Charge sein geschieht meine Datenrahmen. Ich habe versucht:

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

Das Ziel all diese Informationen in einer Spalte (Description2) und eine Zeile für jede batch.Your Hilfe wird sehr geschätzt zu zeigen!

Antwort

3

Hinweis: Dies beantwortet die Frage des OP nicht vollständig.


ich etwas ähnliches (aber nicht genau das gleiche):

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) 

die gibt

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      

ich dies nur, um die Daten in der Konsole zu überprüfen. Ich lege die Metadaten für die Gruppe in eine Reihe anstatt in eine Spalte, weil ich genug Spalten habe, um den Bildschirm schon fast zu überspannen.

Beachten Sie, dass die as("", class(x)) ist sehr unzuverlässig (z. B. nicht mit Date Klasse arbeiten). Es kann notwendig sein, die gesamte Tabelle nur zu einer Zeichenfolge zu zwingen.


Für mehrere Spalten als ein Druck, verwenden 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 

Dieses sehr Handbuch, aber es sollte klar sein, wie es programmatisch getan werden kann, mit sapply(dt, function(x) max(nchar(x))) beginnen.

+0

Vielen Dank für Ihre Antwort Frank. Der Grund, warum ich versuche, all diese Informationen in eine Spalte zu stopfen (Description2), ist, dass ich versuche, dieses Feld nach Salesforce zu exportieren. Salesforce-Reporting ist ziemlich schlecht und es spielt nicht gut mit Daten, die außerhalb seiner Sphäre sind. Bei der Erstellung eines Feldes habe ich darüber nachgedacht, all diese Informationen in einem lesbaren Format anzuzeigen und es gleichzeitig möglich zu machen, es in Salesforce hochzuladen. – gibbz00

+0

Hey Frank, wie zwinge ich deine Ausgabe zu einem Datenrahmen? Und wie kann ich die Max-Punktzahl aus der endgültigen Ausgabe herausnehmen, brauche ich diesen Teil nicht. – gibbz00

+1

@gibbz Der "max score" -Teil wird in 'newrow' angezeigt, also schließe diesen Part vom finalen' rbind' aus. Verwende einfach as.data.frame, wenn du einen data.frame willst. Sie haben Zeilenumbrüche usw. erwähnt, die für mich so klingen, als ob Sie nach der Textausgabe wären, vielleicht mit fwf importieren. – Frank

Verwandte Themen