2010-04-30 12 views
8

प्रिय StackOverFlowers (संक्षेप में फूल) की एक सूची गिर के लिए मेरे कोड में सुधार,data.frames

मैं data.frames (walk.sample) की एक सूची है कि मैं एक एकल (विशाल टुकड़ों में टूट चाहते हैं) डेटा ढांचा। ढहने के दौरान, मैं चिह्नित करना चाहता हूं (एक और कॉलम जोड़ना) जो पंक्तियों से सूची के तत्व से आया है। यह वही है जो मुझे अब तक मिला है।

यह डेटा.फ्रेम है जिसे ढहने/ढेर करने की आवश्यकता है।

> 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 

मैं एक स्तंभ है कि निरूपित जो तत्व से पंक्तियों एक मौजूदा data.frame करने के लिए इसे जोड़कर पीछा आया जोड़ने के लिए एक समारोह में लिखा है।

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 

मैं उत्सुक इस अधिक सुंदर ढंग से किया जा सकता है कि क्या कर रहा हूँ के साथ शायद do.call() या किसी अन्य अधिक सामान्य समारोह?

+0

सत्र कॉलम वास्तव में क्या है? आप स्क्रीन पर खाली सूची क्यों प्रिंट करना चाहते हैं? – hadley

उत्तर

5

मैं यह दावा करते हुए नहीं कर रहा हूँ इस सबसे खूबसूरत दृष्टिकोण हो सकता है, लेकिन मैं इसे

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) 

संपादित

काम कर रहा है मारेक के उपयुक्त टिप्पणियों को लागू करने

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

'cbind' को प्रतिकृति की आवश्यकता नहीं है, आप बस 'session = i' लिख सकते हैं। और बिना प्लीयर के 'de.call (rbind, sapply (......)) का उपयोग कर सकते हैं। – Marek

+0

हाय gd047, मैं बस यह उल्लेख करना चाहूंगा कि आपका समाधान तब काम नहीं करेगा जब डेटा.फ्रेम में पंक्तियों की अलग-अलग संख्या हो। साथ ही, जब पंक्तियों की संख्या समान होती है, तो परिणाम सही नहीं होते हैं (पंक्तियों और स्तंभों के साथ मिश्रण होता है और यहां तक ​​कि कोई कॉलम नाम नहीं होते हैं) –

+0

मुझे लगता है कि 'sapply' को 'lapply'' से प्रतिस्थापित कर सकते हैं। – Marek

6

मैं के बाद लगता है लगता है कि यह काम करेगा ...

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' के बजाय' NROW' का उपयोग करना चाहिए। प्रश्न से डेटा के लिए आपका समाधान काम नहीं करेगा। – Marek

+0

अच्छी पकड़, एनआरओडब्ल्यू एक संभावित फिक्स है, लेकिन मुझे पता नहीं है कि आपके पास 1-पंक्ति डेटाफ़्रेम होने पर अपेक्षित व्यवहार क्या है। मैं इसे एक नल चेक करके बदल दूंगा ... –

+0

अच्छा समाधान जोनाथन! –