2010-03-06 21 views
5

Próbuję znaleźć sposób przekonwertowania wielu wierszy tekstu na ramkę danych . Nie jestem pewien, czy istnieje sposób, w którym można użyć read.delim() do czytania w wielu wierszach tekstu i utworzenia następującej ramki danych z czymś podobnym do rehape() ?.Konwertowanie wielu wierszy tekstu na ramkę danych

Dane są pogrupowane w następujący sposób:

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

Chciałbym przekształcić te dane do czegoś, co wygląda następująco ramce danych:

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

przeprosiny, jeśli jest oczywistym sposobem to zrobić!

Odpowiedz

9

Jak o:

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

co daje:

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

To było sprytne użycie 'sapply()'. Nie myślałem o tym wcześniej. – andrewj

+0

Dzięki. Właśnie zaczynam uczyć się R, więc musiałem spróbować użyć kilku narzędzi do mojej dyspozycji. :) Właśnie zauważyłem twoje rozwiązanie używając 'unstack'. To wygląda na najlepszą dla mnie drogę. – unutbu

+0

Znalazłem to pomocne, ponieważ musiałem przekonwertować ciąg tekstowy '" a; lorem \ nb; ipsum \ nc; gecko "' na data.frame i działało z funkcją 'textConnection()', której nie znałem . – schlusie

0

Oto jedno rozwiązanie za pomocą przekształcenia

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

która produkuje

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 
4

Oto jak to zrobić z pakietem plyr:

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

można uzyskać

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

Można zobaczyć, co magia plyr robi tylko grając z dlply(df,.(V1)) lub dlply(df,.(V1),function(x) x)

+0

Dzięki za sugestię 'plyr'. Zdecydowanie warte dalszej eksploracji. Znalazłem alternatywę dla rozwiązania mojego pytania używając 'unstack' – andrewj

+0

Ah, good call; w tym przypadku jest to prawdopodobnie droga. plyr może być jednak przydatny w innych operacjach typu "grupuj według typu". Jeśli chcesz dowiedzieć się więcej, możesz przeczytać http://had.co.nz/plyr/plyr-intro-090510.pdf –

2

Zamieściłem to pytanie na R-pomoc również otrzymał odpowiedź od Phila Spectora, sugerując, że jest to unstack.

Jest to modyfikacja odpowiedzi Leo Aleksiejewa za

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) 

Skutkuje:

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

Niektóre zalety tego podejścia w porównaniu do innych przemyślanych odpowiedzi jest to, że nie ma potrzeby, aby określić liczba kolumn z wyprzedzeniem. Nie wymaga również żadnych dodatkowych pakietów.

Powiązane problemy