2014-09-21 15 views
5

her kayıt için satır oluşturmak yerine tek bir satıra iç içe liste düzleştirir:as.data.frame bunun yerine şöyle bir yuvalanmış liste var

mylist <- vector("list", 2) 
mylist[[1]]$name <- "The Tucson IOT Meetup Group" 
mylist[[1]]$state <- "AZ" 
mylist[[2]]$name <- "#SFMySQL Meetup" 
mylist[[2]]$state <- "CA" 

mylist 
[[1]] 
[[1]]$name 
[1] "The Tucson IOT Meetup Group" 

[[1]]$state 
[1] "AZ" 


[[2]] 
[[2]]$name 
[1] "#SFMySQL Meetup" 

[[2]]$state 
[1] "CA" 

Ben bir veri çerçevesi çevirmeye istiyorum sütunları "isim" ve "durum" ve her satır için bir tane olmak üzere iki satır. Bunu yapmak as.data.frame kullanmaya çalıştığınızda Ancak, böyle, kayıtları değişkenlerin her biri için ayrı sütunlar, verilerin tek bir satır geri almak:

myframe <- as.data.frame(mylist) 
myframe 
           name state   name.1 state.1 
1 The Tucson IOT Meetup Group AZ #SFMySQL Meetup  CA 

emin değilim ne oluyor. Bunu yapmanın doğru yolu nedir?

cevap

4
do.call(rbind.data.frame, mylist) 
##       name state 
## 2 The Tucson IOT Meetup Group AZ 
## 21    #SFMySQL Meetup CA 

do.call fonksiyon fonksiyonları uygulamak biraz (l/s) gibi ve işlevleri birbirini izleyen aramalar sonuçlarını birikmesine izin verir.

Reduce(rbind.data.frame, mylist) 
##       name state 
##2 The Tucson IOT Meetup Group AZ 
##21    #SFMySQL Meetup CA 

Hatta rbindReduce ile "iş" alabilirsiniz: Reduce işlevi bazen aynı sonuca yol

Reduce(rbind, mylist) 
##  name       state 
##init "The Tucson IOT Meetup Group" "AZ" 
##  "#SFMySQL Meetup"    "CA" 

Başlangıçta en iyi sonucu olabilir düşündüm. (Ben, faktörlerden ziyade karakter değerlerini veren sonuçları tercih ederim.) Ancak, Her ikisi de azaltma yaklaşımları str() ile görüntülendiğinde oldukça garip yapılar sunar.

+0

deneyin. Ne arıyorsun? Neden soyup çalmıyor? – Traviskorte

+1

'mylist' bir vektör ya da matris değildir, bu nedenle rbind.default' işe yaramıyor ve rbind.list 'yok –

+0

Oluşan' 'row.names'' tuhaf (yukarıdaki 21), ama ben Bunun zararsız olduğunu varsayalım, üstelik, herzaman onları "NULL" yapabiliriz ... – PatrickT

3

Ya data.table s rbindlist fonksiyonunu (büyük veri kümeleri için çok verimli) kesinlikle çalışır

library(data.table) 
rbindlist(mylist) 
#       name state 
# 1: The Tucson IOT Meetup Group AZ 
# 2:    #SFMySQL Meetup CA 
İlgili konular