SORU
11 Kasım 2011, Cuma


Aynı anda birden çok veri birleştirme.liste çerçeve

Birçok veri bir listesi var.kareleri birleştirmek istiyorum. Burada sorun, her bir veri.çerçeve satır ve sütun sayısı açısından farklıdır, ama onlar tüm temel değişkenler kodu aşağıdaki "var1" "var2" aradım) paylaşın. Verileri.Kare sütunlar bakımından aynıydı, sadece rbind.fill hangi iş yapmak için 10**, ama bu veri ile durum böyle değil.

merge komut sadece 2 veri üzerinde çalışır çünkü.çerçeveler, fikirler için İnternet döndüm. Mükemmel R çalışmış olan here, " I got zaman vardı ne 2.7.2,:

merge.rec <- function(.list, ...){
    if(length(.list)==1) return(.list[[1]])
    Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)
}

Ve işlevi gibi derim:

df <- merge.rec(my.list, by.x = c("var1", "var2"), 
                by.y = c("var1", "var2"), all = T, suffixes=c("", ""))

Ama herhangi bir R versiyonu ve 2.12, bu kod 2.11 dahil 2.7.2, aşağıdaki hata ile başarısız olur sonra:

Error in match.names(clabs, names(xi)) : 
  names do not match previous names

(Bu arada ben diğer kaynaklar bu hata 30 ** hiçbir çözünürlük ile).

Bunu çözmenin bir yolu var mı?

CEVAP
11 Kasım 2011, Cuma


Azaltmak bu oldukça kolay

merged.data.frame = Reduce(function(...) merge(..., all=T), list.of.data.frames)

İşte tam bir örnek, bazı sahte verileri kullanarak:

set.seed(1)
list.of.data.frames = list(data.frame(x=1:10, a=1:10), data.frame(x=5:14, b=11:20), data.frame(x=sample(20, 10), y=runif(10)))
merged.data.frame = Reduce(function(...) merge(..., all=T), list.of.data.frames)
tail(merged.data.frame)
#    x  a  b         y
#12 12 NA 18        NA
#13 13 NA 19        NA
#14 14 NA 20 0.4976992
#15 15 NA NA 0.7176185
#16 16 NA NA 0.3841037
#17 19 NA NA 0.3800352

Ve burada bir örnek these data my.list çoğaltmak için kullanıyor:

merged.data.frame = Reduce(function(...) merge(..., by=match.by, all=T), my.list)
merged.data.frame[, 1:12]

#  matchname party st district chamber senate1993 name.x v2.x v3.x v4.x senate1994 name.y
#1   ALGIERE   200 RI      026       S         NA   <NA>   NA   NA   NA         NA   <NA>
#2     ALVES   100 RI      019       S         NA   <NA>   NA   NA   NA         NA   <NA>
#3    BADEAU   100 RI      032       S         NA   <NA>   NA   NA   NA         NA   <NA>

Not: bu tartışmalı merge bir hata gibi görünüyor. Sorun ekleri (çakışan olmayan eşleşen adları işlemek için) ekleyerek onları gerçekten benzersiz kılan Onay Yok. Belli bir noktada olan [.data.frame kullanıryokmake.unique isimler rbind başarısız olmasına neden.

# first merge will end up with 'name.x' & 'name.y'
merge(my.list[[1]], my.list[[2]], by=match.by, all=T)
# [1] matchname    party        st           district     chamber      senate1993   name.x      
# [8] votes.year.x senate1994   name.y       votes.year.y
#<0 rows> (or 0-length row.names)
# as there is no clash, we retain 'name.x' & 'name.y' and get 'name' again
merge(merge(my.list[[1]], my.list[[2]], by=match.by, all=T), my.list[[3]], by=match.by, all=T)
# [1] matchname    party        st           district     chamber      senate1993   name.x      
# [8] votes.year.x senate1994   name.y       votes.year.y senate1995   name         votes.year  
#<0 rows> (or 0-length row.names)
# the next merge will fail as 'name' will get renamed to a pre-existing field.

Düzeltme için en kolay yol alanı merge çoğaltır alanları olan çok var () için yeniden adlandırma bırakmayacak. Örneğin:

my.list2 = Map(function(x, i) setNames(x, ifelse(names(x) %in% match.by,
      names(x), sprintf('%s.%d', names(x), i))), my.list, seq_along(my.list))

merge/Reduce o zaman iyi çalışır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • lifeisforsharingDT

    lifeisforsha

    18 Mayıs 2011
  • Rickymon Tero

    Rickymon Ter

    1 Ocak 2007
  • JeezyVEVO

    JeezyVEVO

    12 Mayıs 2009