преобразование нескольких строк текста во фрейм данных - PullRequest
5 голосов
/ 06 марта 2010

Я пытаюсь найти способ конвертировать несколько строк текста в фрейм данных. Я не уверен, есть ли способ использовать read.delim() прочитать несколько строк текста и создать следующий фрейм данных с чем-то похожим на rehape()?.

Данные структурированы следующим образом:

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

Я хотел бы преобразовать эти данные во что-то похожее на следующий фрейм данных:

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

Извините, если есть очевидный способ сделать это!

Ответы [ 4 ]

10 голосов
/ 06 марта 2010

Как насчет:

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

, что дает:

   A  B    C
1  1  2 10.0
2 34 20  6.7
3  2 78 35.0
4 голосов
/ 06 марта 2010

Вот как это сделать с помощью пакета 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]]))

Вы получаете

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

Вы можете увидеть, что делает магический плир, просто играя с dlply(df,.(V1)) или dlply(df,.(V1),function(x) x)

2 голосов
/ 07 марта 2010

Я также разместил этот вопрос на R-help, и получил ответ от Фила Спектора, предлагающий unstack.

Это модификация ответа Льва Алексеева

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)

В результате:

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

Некоторые преимущества этого подхода по сравнению с другими продуманными ответами состоят в том, что вам не нужно заранее указывать количество столбцов. Также не требуется никаких дополнительных пакетов.

0 голосов
/ 06 марта 2010

Вот одно решение, использующее изменение формы

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

Который производит

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...