преобразование нескольких строк текста в кадр данных

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

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

5
задан andrewj 6 March 2010 в 04:31
поделиться

4 ответа

Как насчет :

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
11
ответ дан 18 December 2019 в 09:49
поделиться

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

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

4
ответ дан 18 December 2019 в 09:49
поделиться

Я также разместил этот вопрос в R-help и получил ответ от Фила Спектора с предложением распаковать .

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

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

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

2
ответ дан 18 December 2019 в 09:49
поделиться

Вот одно из решений с использованием 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")

, которое дает

  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
0
ответ дан 18 December 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: