2010-04-30 13 views
8

Değerli StackOverFlowers (kısacası çiçekler) bir listesini çöken benim kod geliştirmek) veri çerçevesi. Çökerken, listenin hangi elemanından hangi satırların geldiğini (başka bir sütun ekleyerek) işaretlemek istiyorum. Şimdiye kadar sahip olduğum şey bu.Bir tek (dev içine çökmeye istiyorum <p></p> Ben data.frames (walk.sample) bir listesi var, data.frames

Bu, daraltılması/yığılması gereken bir data.frame dosyasıdır.

> walk.sample 
[[1]] 
    walker  x   y 
1073  3 228.8756 -726.9198 
1086  3 226.7393 -722.5561 
1081  3 219.8005 -728.3990 
1089  3 225.2239 -727.7422 
1032  3 233.1753 -731.5526 

[[2]] 
    walker  x   y 
1008  3 205.9104 -775.7488 
1022  3 208.3638 -723.8616 
1072  3 233.8807 -718.0974 
1064  3 217.0028 -689.7917 
1026  3 234.1824 -723.7423 

[[3]] 
[1] 3 

[[4]] 
    walker  x   y 
546  2 629.9041 831.0852 
524  2 627.8698 873.3774 
578  2 572.3312 838.7587 
513  2 633.0598 871.7559 
538  2 636.3088 836.6325 
1079  3 206.3683 -729.6257 
1095  3 239.9884 -748.2637 
1005  3 197.2960 -780.4704 
1045  3 245.1900 -694.3566 
1026  3 234.1824 -723.7423 

hangi eleman gelen satırları varolan data.frame e ekleyerek izledi geldi belirtmek sütun eklemek için bir işlev yazdım.

collapseToDataFrame <- function(x) { # collapse list to a dataframe with a twist 
    walk.df <- data.frame() 
    for (i in 1:length(x)) { 
     n.rows <- nrow(x[[i]]) 
     if (length(x[[i]])>1) { 
      temp.df <- cbind(x[[i]], rep(i, n.rows)) 
      names(temp.df) <- c("walker", "x", "y", "session") 
      walk.df <- rbind(walk.df, temp.df) 
     } else { 
      cat("Empty list", "\n") 
     } 
    } 
    return(walk.df) 
} 


> collapseToDataFrame(walk.sample) 
Empty list 
Empty list 
    walker   x   y session 
3   1 -604.5055 -123.18759  1 
60  1 -562.0078 -61.24912  1 
84  1 -594.4661 -57.20730  1 
9   1 -604.2893 -110.09168  1 
43  1 -632.2491 -54.52548  1 
1028  3 240.3905 -724.67284  1 
1040  3 232.5545 -681.61225  1 
1073  3 228.8756 -726.91980  1 
1091  3 209.0373 -740.96173  1 
1036  3 248.7123 -694.47380  1 

belki (do.call ile bu daha zarif yapılabilir olup olmadığını merak ediyorum) ya da diğer bazı daha genel fonksiyon?

+0

Oturum sütunu tam olarak nedir? Neden boş listeyi ekrana yazdırmak istiyorsunuz? – hadley

cevap

5

bu en şık yaklaşım olduğunu iddia eden değilim, ama Marek apt Açıklamalar

do.call(rbind,lapply(1:length(walk.sample), function(i) 
      if (length(walk.sample[[i]]) > 1) 
      cbind(walk.sample[[i]],session=i) )) 
+1

'cbind' Çoğaltma gerektirmez, sadece' session = i 'yazabilirsiniz. Ve plyr olmadan “do.call (rbind, sapply (......))' kullanabilir. – Marek

+0

Merhaba gd047, sadece data.frame farklı sayıda satır olduğunda çözümün işe yaramayacağını belirtmek isterim. Ayrıca, satır sayısı aynı olduğunda, sonuçlar doğru değildir (satır ve sütunlarla bir karışım vardır ve ayrıca sütun isimleri yoktur) –

+0

Sanırım "sapsız" ın yerine "lapply" yardımcı olabilir. – Marek

6

I uygulandıktan sonra

library(plyr) 

ldply(sapply(1:length(walk.sample), function(i) 
      if (length(walk.sample[[i]]) > 1) 
      cbind(walk.sample[[i]],session=rep(i,nrow(walk.sample[[i]]))) 
    ),rbind) 

DÜZENLEME

işe yarıyor Bunun işe yarayacağını düşün ...

lengths <- sapply(walk.sample, function(x) if (is.null(nrow(x))) 0 else nrow(x)) 
cbind(do.call(rbind, walk.sample[lengths > 1]), 
     session = rep(1:length(lengths), ifelse(lengths > 1, lengths, 0))) 
+0

'nrow' yerine' NROW 'kullanmalısınız. Sorulan veriler için çözümünüz işe yaramaz. – Marek

+0

İyi yakalama, NROW olası bir düzeltme, ancak 1 satırlık bir veri kargosu olduğunda beklenen davranışın ne olduğunu bilmiyorum. Bunun yerine bir NULL kontrolü yaparak değiştireceğim ... –

+0

İyi bir çözüm Jonathan! –

İlgili konular