5 Stimmen

Umwandlung mehrerer Textzeilen in einen Datenrahmen

Ich versuche, eine Möglichkeit zu finden, mehrere Textzeilen in einen Datenrahmen zu konvertieren. Ich bin nicht sicher, ob es eine Möglichkeit gibt, bei der man read.delim() um mehrere Textzeilen einzulesen und den folgenden Datenrahmen zu erstellen mit etwas ähnlichem wie rehape() ?.

Die Daten sind wie folgt strukturiert:

A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35

Ich möchte diese Daten in etwas umwandeln, das wie der folgende Datenrahmen aussieht:

A             B             C
1             2             10
34            20            6.7
2             78            35

Bitte entschuldigen Sie, wenn es einen offensichtlichen Weg gibt, dies zu tun!

11voto

unutbu Punkte 769083

Wie wäre es mit:

s<-"A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35
"
d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE)
cols<-levels(d[,'V1'])
d<-data.frame(sapply(cols,function(x) {d['V2'][d['V1']==x]}, USE.NAMES=TRUE))

was zur Folge hat:

   A  B    C
1  1  2 10.0
2 34 20  6.7
3  2 78 35.0

4voto

Leo Alekseyev Punkte 12075

Hier sehen Sie, wie Sie dies mit dem plyr-Paket tun können:

require("plyr")
my.data <- "A: 1
            B: 2
            C: 10
            A: 34
            B: 20
            C: 6.7
            A: 2
            B: 78
            C: 35"   
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE)

as.data.frame(dlply(df,.(V1),function(x) x[[2]]))

Sie erhalten

   A  B    C
1  1  2 10.0
2 34 20  6.7
3  2 78 35.0

Sie können sehen, was magic plyr tut, indem Sie einfach mit dlply(df,.(V1)) ou dlply(df,.(V1),function(x) x)

2voto

andrewj Punkte 2845

Ich habe diese Frage auch auf R-help gestellt und eine Antwort von Phil Spector erhalten, der vorschlug unstack .

Dies ist eine Abänderung der Antwort von Leo Alekseyev

my.data <- "A: 1
            B: 2
            C: 10
            A: 34
            B: 20
            C: 6.7
            A: 2
            B: 78
            C: 35"   
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE)
unstack(df, V2 ~ V1)

Dies führt zu:

   A  B    C
1  1  2 10.0
2 34 20  6.7
3  2 78 35.0

Einige Vorteile dieses Ansatzes im Vergleich zu den anderen durchdachten Antworten ist, dass Sie die Anzahl der Spalten nicht im Voraus festlegen müssen. Es sind auch keine zusätzlichen Pakete erforderlich.

0voto

Hier ist eine Lösung mit reshape

s<-"A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35
"
d<-d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE)
N<-nrow(d)%/%3
d$id<-rep(1:N,each=3)
reshape(d,dir="wide",timevar="V1",idvar="id")

Das erzeugt

  id V2.A V2.B V2.C
1  1    1    2 10.0
4  2   34   20  6.7
7  3    2   78 35.0

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X