2016-05-03 4 views
0

У меня есть список, который я хотел бы преобразовать в таблицу данных данных выглядят, как показано ниже:Рядов столбцов в R

"Customer" 
"Steve" 
"AddressLine" 
"2041" 
"Total" 
"10" 
"MailItemInfo" 
"None" 
"Customer" 
"Mike" 
"AddressLine" 
"2043" 
"Total" 
"20" 
"MailItemInfo" 
"Yes" 
"Customer" 
"Jenn" 
"AddressLine" 
"1132" 
"Total" 
"24" 
"MailItemInfo" 
"Yes" 

Эта модель заканчивает повторяется для 5 различных адресов. Я хотел бы поставить каждую вторую строку в новый столбец, например, что:

"Customer" "AddressLine" "BatchTotal" "MailItemInfo" 
"Steve" "2041" "10" "None" 
"Mike" "2043" "20" "Yes" 
"Jenn" "1132" "24" "Yes" 

Я хотел бы так, что всякий раз, когда эти новые «столбцы» продолжают появляться в списке данных - они будут автоматически заселить в новый колонны. Любой, кто может предоставить решение, действительно поможет!

+0

, пожалуйста, посмотрите это сообщение - http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Bulat

+2

Это «список»? Вероятно, у вас есть вектор ... Совместное использование данных с 'dput()' не оставляет двусмысленности и копируется/вставляется! – Gregor

ответ

0
l <- list("Customer", 
      "Steve", 
      "AddressLine", 
      "2041", 
      "Total", 
      "10", 
      "MailItemInfo", 
      "None", 
      "Customer", 
      "Mike", 
      "AddressLine", 
      "2043", 
      "Total", 
      "20", 
      "MailItemInfo", 
      "Yes", 
      "Customer", 
      "Jenn", 
      "AddressLine", 
      "1132", 
      "Total", 
      "24", 
      "MailItemInfo", 
      "Yes") 

Если у вас нет каких-либо изменений в структуре, это будет работать:

data.frame(matrix(unlist(l), ncol=8, byrow=TRUE))[c(2,4,6,8)] 

    X2 X4 X6 X8 
1 Steve 2041 10 None 
2 Mike 2043 20 Yes 
3 Jenn 1132 24 Yes 

Но если вы хотите добавить столбцы, как они появляются, вы можете пойти на расплавленном data.frame. На самом деле iy = t легче выполнить это с помощью data.table.

Во-первых, вы должны решить, что это начало новой строки, например, «Клиент»:

l <- list("Customer", 
     "Steve", 
     "AddressLine", 
     "2041", 
     "Total", 
     "10", 
     "MailItemInfo", 
     "None", 
     "Customer", 
     "Mike", 
     "AddressLine", 
     "2043", 
     "Total", 
     "20", 
     "MailItemInfo", 
     "Yes", 
     "Customer", 
     "Jenn", 
     "AddressLine", 
     "1132", 
     "Total", 
     "24", 
     "MailItemInfo", 
     "Yes", 
     "NewColumn", 
     "xxx") 

library(data.table) 
dt <- data.table(matrix(unlist(l), ncol=2, byrow=TRUE)) # melted data.table 
dt[V1=='Customer', id:=.I] # add id attribute to each "Customer" 
dt[, id := id[1], by = cumsum(!is.na(id))] # set the id to following attributes 
dcast(dt,id~V1, value.var="V2", fill=NA) # reverse the melted to large data.table 

    id AddressLine Customer MailItemInfo NewColumn Total 
1: 1  2041 Steve   None  NA 10 
2: 2  2043  Mike   Yes  NA 20 
3: 3  1132  Jenn   Yes  xxx 24 
+0

thanks @thelatemail – HubertL

0

Предполагая, что список выше под названием: «MyList». Попробуйте следующее:

titleseq<-seq(1, 8, by =2) 
titles<-droplevels(mylist[titleseq,1]) 

nameseq<-seq(2, 40, by=8) 
names<-droplevels(mylist[nameseq,1]) 
addres<-droplevels(mylist[(nameseq+2),1]) 
tot<-droplevels(mylist[(nameseq+4),1]) 
mailitem<-droplevels(mylist[(nameseq+6),1]) 

df<-data.frame(names, addres, tot, mail item) 
names(df)<-titles 

Это очень грубо вынуждено, но должно сделать трюк.

+1

«Список» (вектор?) В вопросе OPs довольно четко 1-мерный, так почему вы его подмножите в двух измерениях? Кроме того, вместо всех «каплей» вы можете просто перейти к символу. – Gregor

+0

Грег. Я перечисляю его здесь как единый кадр данных столбца. Вы хорошо понимаете, что нужно сначала преобразовать в персонаж. – Dave2e

Смежные вопросы