R

Εισαγωγη στην R

Δομές Δεδομένων

Άννα Μοσχά
Κέντρο Η/Υ, Ε.Μ.Π.

Περιεχομενα

  1. Βασικές Δομές Δεδομένων
  2. Δημιουργία Διανυσμάτων - Ακολουθιών
  3. Πράξεις με αριθμητικά διανύσματα
  4. Χρήσιμες συναρτήσεις για διανύσματα
  5. Υποσύνολα διανύσματος
  6. Χρήσιμες συναρτήσεις για διανύσματα χαρακτήρων
  7. Factor
  8. Διδιάστατοι πίνακες - Δημιουργία
  9. Διδιάστατοι πίνακες - Υποσύνολα
  10. Διδιάστατοι πίνακες - Συναρτήσεις - Πράξεις
  11. Arrays
  12. Arrays - Υποσύνολα
  13. Λίστες
  14. Λίστες - Ονόματα στοιχείων
  15. Λίστες - Υποσύνολα
  16. Πλαίσια Δεδομένων
  17. Πλαίσια Δεδομένων - Χρήσιμες συναρτήσεις
  18. Πλαίσια Δεδομένων - Υποσύνολα
  19. Προσθήκη σε πλαίσιο δεδομένων
  20. Συναρτήσεις ταξινόμησης σε διάνυσμα
  21. Συνάρτηση ταξινόμησης σε πλαίσιο δεδομένων
  22. Συναρτήσεις attach(), detach() σε πλαίσια δεδομένων

Βασικές Δομές Δεδομένων(1)

Οι κύριες δομές δεδομένων στην R είναι:
  • Διανύσματα (vectors): Ακολουθία ίδιου τύπου στοιχείων.
  • Διδιάστατοι Πίνακες (matrices) : είναι διανύσματα 2 διαστάσεων.
  • Πολυδιάστατοι Πίνακες (arrays) : είναι πίνακες με 3 ή περισσότερες διαστάσεις.
  • Λίστες (lists) : Γενικευμένα διανύσματα που κάθε στοιχείο τους δεν χρειάζεται να είναι του ίδιου τύπου.
  • Πλαίσια Δεδομένων (data frames). Αποθηκεύει πίνακα δεδομένων. Λίστα όπου κάθε μέλος έχει το ίδιο μήκος. Γραμμές --> Παρατηρήσεις, Στήλες--> Μεταβλητές.

Βασικές Δομές Δεδομένων(2)

  • Στις 3 πρώτες δομές (δηλαδή Διανύσματα και Πίνακες) τα στοιχεία τους πρέπει να είναι του ίδιου τύπου.
  • Οι λίστες και τα πλαίσια δεδομένων μπορούν να περιέχουν ως στοιχεία άλλες δομές δεδομένων.
  • Η συνάρτηση structure str() δίνει χρήσιμες πληροφορίες για την δομή του αντικειμένου.
    • Παράδειγμα:
      > y<-list(c(1,2,3,4,5), "aaa", 5, T, 3+2i) 
      > str(y)
      List of 5
       $ : num [1:5] 1 2 3 4 5
       $ : chr "aaa"
       $ : num 5
       $ : logi TRUE
       $ : cplx 3+2i 

Δημιουργία διανυσμάτων - ακολουθιών (1)

  • Δημιουργία διανύσματος με την συνάρτηση vector()
    > x<-vector(mode="numeric", length=5)
    > x
    [1] 0 0 0 0 0
  • Συνήθως δημιουργούμε απ' αυθείας μια ακολουθία με κάποιον από τους παρακάτω τρόπους
  • Με τον τελεστή ":" : Δημιουργεί είτε ακεραίους είτε δεκαδικούς ανάλογα με τις τιμές που θα δοθούν.Το βήμα πάντα είναι 1.
    > x<-4:10
    > x
    [1]  4  5  6  7  8  9 10
    > y<-1.2:5.2
    > y
    [1] 1.2 2.2 3.2 4.2 5.2

Δημιουργία διανυσμάτων - ακολουθιών (2)

  • Με την συνάρτηση combine c(): Δημιουργεί είτε numeric διάνυσμα είτε character διάνυσμα ανάλογα με τι θα δοθεί.
    > k<-c(1,2,3,4,5)
    > k
    [1] 1 2 3 4 5
    > l<- c("anna", "moscha") 
    > l
    [1] "anna"   "moscha" 
    > z<-c(1.7,"test") 
    > z
    [1] "1.7"  "test"
  • (Όταν δοθεί και numeric και character μετατρέπει το numeric σε character)

Δημιουργία διανυσμάτων - ακολουθιών (3)

  • Με την συνάρτηση scan() δίνοντας εμείς στην οθόνη τα στοιχεία του διανύσματος ένα-ένα, στο τέλος πατάμε enter.
    > y<- scan()
    1: 10
    2: 2	
    3: 3
    4: 
    Read 3 items
    > y
    [1] 10 2 3 
  • Έδωσα αριθμητικά δεδομένα. Αν έδινα character θα είχα το παρακάτω λάθος γιατί by default θεωρεί ότι θα λάβει numeric:
    > y<- scan()
    1: f
    1: d
    Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
      scan() expected 'a real', got 'f' 

Δημιουργία διανυσμάτων - ακολουθιών (4)

Για να δώσω τύπου chatacter θα πρέπει να γράψω:
> y<- scan(what=character())
1: f
2: d
3: anna
4: lalal
5: 
Read 4 items
> y
[1] "f"     "d"     "anna"   "lalal"

Δημιουργία διανυσμάτων - ακολουθιών (5)

  • Με την συνάρτηση seq(): Μπορώ να δώσω ή το βήμα ή το πλήθος των αριθμών
    > seq(from=1, to=30, by=5)
    [1]  1  6 11 16 21 26
    > seq(1,12,length=3)
    [1]  1.0  6.5 12.0 
  • Ενώ έχω δώσει ακεραίους επειδή ο ένας αριθμός της ακολουθίας που προκύπτει είναι δεκαδικός μετατρέπονται όλοι σε δεκαδικοί.

Δημιουργία διανυσμάτων - ακολουθιών (6)

  • Με την συνάρτηση rep(): Επαναλαμβάνει ένα διάνυσμα όσες φορές του δηλωθεί.
     > rep("A",5) 
    [1] "A" "A" "A" "A" "A"
    Το αποτέλεσμα είναι ένα διάνυσμα
     > rep(letters[1:5],3)
     [1] "a" "b" "c" "d" "e" "a" "b" "c" "d" "e" "a" "b" "c" "d" "e"
    Επαναλαμβάνει 3 φορές το διάνυσμα που περιέχει τα 5 πρώτα μικρά γράμματα της αλφαβήτας.
    Η ενσωματομένη στην R σταθερά letters περιέχει τα μικρά γράμματα της αλφαβήτας.
     > rep(LETTERS[1:5],each=3)
     [1] "A" "A" "A" "B" "B" "B" "C" "C" "C" "D" "D" "D" "E" "E" "E"
  • Επαναλαμβάνει 3 φορές το κάθε στοιχείου του διανύσματος που περιέχει τα 5 πρώτα κεφαλαία γράμματα της αλφαβήτας.
    Η ενσωματομένη στην R σταθερά LETTERS περιέχει τα κεφαλαία γράμματα της αλφαβήτας.

Δημιουργία διανυσμάτων - ακολουθιών (7)

  • Με την συνάρτηση paste() η οποία χρησιμοποιείται και για την συνένωση δεδομένων χαρακτήρων
    > paste("A", 1:6, sep= "") 
    [1] "A1" "A2" "A3" "A4" "A5" "A6"
  • Συνενώνει τον χαρακτήρα "A" με την ακολουθία αριθμών από το 1 εως το 6 χωρίς να προσθέτει κάποιον διαχωριστικό χαρακτήρα.
  • Με την συνάρτηση sample() : Δημιουργεί τυχαία ακολουθία.
    > sample(LETTERS,5) 
    [1] "M" "C" "Z" "E" "G"
    Από τα κεφαλαία γράμματα του αλφαβήτου μας δίνει τυχαία 5 χωρίς επανάθεση.
    > sample(1:20, 5, replace=TRUE) 
    [1] 15 10 15 15  3
  • Από την ακολουθία αριθμών από το 1 έως το 20 μας δίνει τυχαία 5 αριθμούς με επανάθεση. Παρατηρούμε ότι το 15 επιλέχθηκε δύο φορές.

Δημιουργία διανυσμάτων - ακολουθιών (8)

Καλό είναι να να βάζουμε πριν το τυχαίο δείγμα το set.seed() για να μπορούμε να αναπαράγουμε το ίδιο τυχαίο δείγμα
> set.seed(200)
> sample(1:20, 5, replace=TRUE)
[1] 11 12 12 14 14
> sample(1:20, 5, replace=TRUE)
[1] 17 15  2 11  5
> sample(1:20, 5, replace=TRUE)
[1] 10 13  4 13  8
> set.seed(200)
> sample(1:20, 5, replace=TRUE)
[1] 11 12 12 14 14
Παρατηρώ ότι όταν ξαναεπιλέξω το set.seed(200) το sample πλέον θα μου επιστρέψει τους ίδιους αριθμούς που μου επέστρεψε όταν πρωτοχρησιμοποιήθηκε.

Πράξεις με αριθμητικά διανύσματα(1)

  • Πράξη διανύσματος με αριθμό ---> Η πράξη γίνεται για κάθε όρο του διανύσματος
    > y<- 4:10
    > y
    [1]  4  5  6  7  8  9 10
    > y*10
    [1]  40  50  60  70  80  90 100
    > y^2
    [1]  16  25  36  49  64  81 100

Πράξεις με αριθμητικά διανύσματα(2)

  • Πράξη διανύσματος με διάνυσμα
    > k<-c(10,20,30,40)
    > k
    [1] 10 20 30 40
    > y+k
    [1] 14 25 36 47 18 29 40
    Warning message:
    In y + k : longer object length is not a multiple of shorter object length
    > k+c(100,200,300,400)
    [1] 110 220 330 440
  • Όταν δεν είναι ίσου μήκους τα διανύσματα κάνει την πράξη επαναλαμβάνοντας τους όρους του μικρότερου διανύσματος όσο χρειάζεται και βγάζει προειδοποιητικό μήνυμα
  • Διάνυσμα προκύπτει από διάνυσμα
    > k2<-c(1, y, k)
    > k2
     [1]  1  4  5  6  7  8  9 10 10 20 30 40

Χρήσιμες συναρτήσεις για διανύσματα (1)

  • length(): μήκος διανύσματος
  • min(), max(): μικρότερη, μεγαλύτερη τιμή του διανύσματος
  • head(): λίγα στοιχεία από την αρχή του διανύσματος
  • tail(): λίγα στοιχεία από το τέλος του διανύσματος
  • Παράδειγμα
    > set.seed(200)
    > x<-sample(1:6, 50, replace=T)
    > x
     [1] 4 4 4 5 5 6 5 1 4 2 3 4 1 4 3 2 4 1 6 4 3 1 2 6 2 2 5 3 1 4 2 1 3 2 6 4 2 6 3 3 4 5 5 2 6 5 1 4 4 5
    > length(x) ; min(x) ; max(x)
    [1] 50
    [1] 1
    [1] 6 
    > head(x); tail(x)
    [1] 4 4 4 5 5 6
    [1] 6 5 1 4 4 5 

Χρήσιμες συναρτήσεις για διανύσματα (2)

  • sum(), prod() : άθροισμα, γινόμενο των στοιχείων του διανύσματος
    > sum(x); prod(x)
    [1] 174
    [1] 1.369513e+24
  • sort(): ταξινόμιση των στοιχείων του διανύσματος
    > sort(x, decreasing=T)
    [1] 6 6 6 6 6 6 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1
  • summary(): δίνει κάποια βασικά στατιστικά στοιχεία για τα στοιχεία του διανύσματος
    > summary(x)
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
       1.00    2.00    4.00    3.48    5.00    6.00 
Χρήσιμες συναρτήσεις για διανύσματα (3)
  • plot() : δίνει το γράφημα των στοιχείων του διανύσματος
    > plot(x)
  • RStudio

Χρήσιμες συναρτήσεις για διανύσματα (4)

  • names(): τα ονόματα των στοιχείων ενός διανύσματος. Μπορώ να δώσω ονόματα στα στοιχεία ενός διανύσματος
  • Παράδειγμα
    > x
     [1] 4 4 4 5 5 6 5 1 4 2 3 4 1 4 3 2 4 1 6 4 3 1 2 6 2 2 5 3 1 4 2 1 3 2 6 4 2 6 3 3 4 5 5 2 6 5 1 4 4 5
    > names(x)
    NULL
    > height<-c(160, 170, 180, 190)
    > height
    [1] 160 170 180 190
    > names(height)<-c("Mary", "Anna", "John", "Peter")
    > height
     Mary  Anna  John Peter 
      160   170   180   190  

Υποσύνολα διανύσματος - Παραδείγματα

  • []: Χρησιμοποιώ για να πάρω μέρος του διανύσματος (γενικά χρησιμοποιείται για να πάρω μέρος του ίδιου του αντικειμένου). Παραδείγματα:
  • > b <- c(TRUE,TRUE,FALSE, T, F) # δημιουργώ το διάνυσμα b
    > b[3] # παίρνω το στοιχείο του b που βρίσκεται στην 3η θέση
    [1] FALSE 
    > b[b==T]  # παίρνω όλα τα στοιχεία του b που είναι TRUE
    [1] TRUE TRUE TRUE
    > b[1:3]  # παίρνω τα στοιχεία του b από την 1η έως την 3η θέση
    [1]  TRUE  TRUE FALSE
    > b[c(1,3)] # παίρνω το 1ο και το 3ο στοιχείο του b
    [1]  TRUE FALSE
    > b[-c(1,3)] # παίρνω όλα τα στοιχεία του b εκτός από το 1ο και το 3ο
    [1]  TRUE  TRUE FALSE  
  • which(): Χρησιμοποιώ την συνάρτηση για να πάρω τη θέση τιμής του διανύσματος
  • > which(b==T)
    [1] 1 2 4 

Υποσύνολα διανύσματος - Παραδείγματα

  • Εξαγωγή μέρους των γραμμάτων και επάναληψη τους
  • > rep(letters[1:5],3)
     [1] "a" "b" "c" "d" "e" "a" "b" "c" "d" "e" "a" "b" "c" "d" "e"
    > rep(LETTERS[1:5],each=3)
     [1] "A" "A" "A" "B" "B" "B" "C" "C" "C" "D" "D" "D" "E" "E" "E"  
  • Αλλαγή της τιμής σε υποσύλο των στοιχείων ενός διανύσματος.
  • Παράδειγμα: Σε ένα διάνυσμα θέτω με 0 όλα τα στοιχεία του που είναι μικρότερα του 6
    > x <- c(3, 5, 1, 10, 12, 6)
    > x
    [1]  3  5  1 10 12  6
    > x[x <= 5] <- 0
    > x
    [1]  0  0  0 10 12  6 

Χρήσιμες συναρτήσεις για διανύσματα χαρακτήρων(1)

  • paste() : συνενώνει δεδομένα χαρακτήρων
  • > paste("A", "BBBBB", "CCCCC", sep= "")
    [1] "ABBBBBCCCCC"
    Συνενώνει τον χαρακτήρα 'A' με τα διανύσματα "BBBBB" και "CCCCC" χωρίς κανένα ενδιάμεσο διαχωριστικό χαρακτήρα (χρησιμοποιεί το κενό για διαχωριστικό μεταξύ των διανυσμάτων).

Χρήσιμες συναρτήσεις για διανύσματα χαρακτήρων(2)

  • grep(): ψάχνει να βρει ένα σύνολο χαρακτήρων σε ένα άλλο σύνολο χαρακτήρων
  • > x<-paste("A", 1:6, sep= "")
    > x
    [1] "A1" "A2" "A3" "A4" "A5" "A6"
    > grep('A', x)
    [1] 1 2 3 4 5 6  
    Ψάχνει να βρει αν υπάρχει ο χαρακτήρας 'A' στο διάνυσμα x και επιστρέφει την θέση που τον βρήκε. Αν βάζαμε value=TRUE θα μας επέστρεφε τις τιμές των στοιχείων του διανύσματος και όχι την θέση τους.
    > grep('A', x,value=T)
    [1] "A1" "A2" "A3" "A4" "A5" "A6"
    > grep('2', x)
    [1] 2
    > grep('2', x,value=T)
    [1] "A2" 

Χρήσιμες συναρτήσεις για διανύσματα χαρακτήρων(3)

  • sub(): αντικαθιστά ένα σύνολο χαρακτήρων με ένα άλλο σύνολο χαρακτήρων
  • > y<-sub('A','B',x)
    > y
    [1] "B1" "B2" "B3" "B4" "B5" "B6" 
    Αντικαθιστά τον χαρακτήρα 'A' που βρίσκεται στο διάνυσμα x με τον χαρακτήρα 'B' και τις νέες τιμές που προκύπτουν τις εκχωρεί σε ένα νέο διάνυσμα y.

Factor (1)

  • Είναι ειδικά διανύσματα που χρησιμεύουν για να αναπαραστούν κατηγορικά δεδομένα (κατηγορική-ποιοτική μεταβλητή).
  • Μπορεί να είναι χωρίς διάταξη ή με διάταξη.
  • Παράδειγμα χωρίς διάταξη:
    > f<- factor(c("Male","Female", "Female", "Male","Male"))
    > f
    [1] Male   Female Female Male   Male  
    Levels: Female Male 
    Ορίζονται αυτόματα τα επίπεδα με αλφαβητική σειρά ή ορίζω εγώ τα επίπεδα.
    > f<- factor(c("Male","Female", "Female", "Male","Male"), levels=c("Male", "Female"))
    > f
    [1] Male   Female Female Male   Male  
    Levels: Male Female 

Factor (2)

  • Ουσιατικά ένα factor διάνυσμα είναι ένα διάνυσμα ακεραίων όπου κάθε ακέραιος έχει μία ονομασία (label).Ένα factor διάνυσμα είναι από μόνο του αυτό-επεξηγηματικό. Ενώ αποθηκεύει ακεραίους, παρουσιάζει την πληροφορία με επεξηγηματικό τρόπο μέσω των levels του.
  • Παρατηρήστε το αποτέλεσμα των εντολών:
    > class(f)
    [1] "factor"
    > mode(f)
    [1] "numeric"
    > str(f)
     Factor w/ 2 levels "Male","Female": 1 2 2 1 1 

Factor (3)

  • Δημιουργία factor με διάταξη:
  • > k <- factor(LETTERS[3:1], ordered = TRUE)
    > k
    [1] C B A
    Levels: A < B < C 
  • gl(n,k): συνάρτηση που γεννά n επίπεδα με k επαναλήψεις. Χρησιμοποιείτε για την δημιουργία factors
  • > f1<-gl(3,10)
    > f1
     [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3
    Levels: 1 2 3 
    > class(f1)
    [1] "factor" 

Διδιάστατοι πίνακες - Δημιουργία (1)

  • Με την συνάρτηση matrix():
  • > x<-1:6
    > m<-matrix(x, nrow=2, ncol=3)
    > m
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    > m1<-matrix(x, nrow=2, ncol=3, byrow=T)
    > m1
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]    4    5    6  
    Η συνάρτηση matrix παίρνει ως όρισμα ένα διάνυσμα, τον αριθμό γραμμών του πίνακα και τον αριθμό στηλών και σχηματίζει τον πίνακα προκαθωρισμένα κατά στήλη αλλά μπορούμε να τον σχηματίσουμε και κατά γραμμή με κατάλληλη δήλωση

Διδιάστατοι πίνακες - Δημιουργία (2)

  • Από ένα διάνυσμα και την συνάρτηση της διάστασης πίνακα dim():
  • > m2<-1:6
    > m2
    [1] 1 2 3 4 5 6
    > dim(m2)<-c(2,3)
    > m2
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6  
    Σχηματίζεται ο πίνακας κατά στήλη.

Διδιάστατοι πίνακες - Δημιουργία (3)

  • Από ίσου μήκους διανύσματα και τις συναρτήσεις cbind() (συνένωση κατά στήλη) και rbind() (συνένωση κατά γραμμή):
  • > m1<-1:3
    > m1
    [1] 1 2 3
    > m2<-10:12
    > m2
    [1] 10 11 12
    > mc=cbind(m1,m2)
    > mc
         m1 m2
    [1,]  1 10
    [2,]  2 11
    [3,]  3 12
    > mr=rbind(m1,m2)
    > mr
       [,1] [,2] [,3]
    m1    1    2    3
    m2   10   11   12  
Διδιάστατοι πίνακες - Υποσύνολα(1)
  • []: Χρησιμοποιώ για να πάρω μέρος του πίνακα. Εύρεση στοιχείου, γραμμής, στήλης πίνακα:
    • Στοιχείο: δίνοντας την θέση του στοιχείου
    • > m<-cbind(c(1,2,3),c(10,11,12),c(100,200,300))
      > m
           [,1] [,2] [,3]
      [1,]    1   10  100
      [2,]    2   11  200
      [3,]    3   12  300
      > m[3,1]
      [1] 3  
    • Γραμμής: δίνοντας μόνο την γραμμή που ενδιαφέρει
    • > m[3,]
      [1]   3  12 300 
    • Στήλης: δίνοντας μόνο την στήλη που ενδιαφέρει
    • > m[,2]
      [1] 10 11 12 
Διδιάστατοι πίνακες - Υποσύνολα(2)
  • Εύρεση τμήματος του πίνακα: δίνοντας τον συνδυασμό γραμμών και στηλών που ενδιαφέρει
  • > m
         [,1] [,2] [,3]
    [1,]    1   10  100
    [2,]    2   11  200
    [3,]    3   12  300
    > m[c(1,3),2:3]
         [,1] [,2]
    [1,]   10  100
    [2,]   12  300
Διδιάστατοι πίνακες - Διαγραφή - Ιδιότητες
  • Διαγραφή στήλης ή γραμμής με το πρόσημο '-'. Παράδειγμα: διαγραφή της 3ης στήλης του πίνακα m
  • > m[,-3]
         [,1] [,2]
    [1,]    1   10
    [2,]    2   11
    [3,]    3   12 
  • Ιδιότητες πινάκων (οποιουδήποτε αντικειμένου) τις παίρνω με την συνάρτηση attributes() :
  • > attributes(m) 
    $dim
    [1] 3 3 
    > k2
     [1]  1  4  5  6  7  8  9 10 10 20 30 40
    > attributes(k2)
    NULL  
    Ο πίνακας έχει μία ιδιότητα την διάσταση του. Το διάνυσμα δεν έχει καμία ιδιότητα.
Διδιάστατοι πίνακες - Συναρτήσεις - Πράξεις
  • Δημιουργία διαγώνιου πίνακα με την συνάρτηση diag():
  • > diag(1:3)
         [,1] [,2] [,3]
    [1,]    1    0    0
    [2,]    0    2    0
    [3,]    0    0    3 
  • Ταυτοτικός πίνακας:
  • > diag(3)
         [,1] [,2] [,3]
    [1,]    1    0    0
    [2,]    0    1    0
    [3,]    0    0    1 
  • %*% : πολλαπλασιασμός πινάκων
  • > diag(1:3)%*%m
         [,1] [,2] [,3]
    [1,]    1   10  100
    [2,]    4   22  400
    [3,]    9   36  900 
Διδιάστατοι πίνακες - Συναρτήσεις
  • t(): ανάστροφος πίνακας
  • > t(m)
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]   10   11   12
    [3,]  100  200  300 
  • solve() με όρισμα τετράγωνο πίνακα : δίνει τον αντίστροφο του πίνακα
  • > solve(diag(1:3))
         [,1] [,2]      [,3]
    [1,]    1  0.0 0.0000000
    [2,]    0  0.5 0.0000000
    [3,]    0  0.0 0.3333333
    > solve(m)
    Error in solve.default(m) : 
      Lapack routine dgesv: system is exactly singular: U[3,3] = 0
    > det(m)
    [1] 0
    
    Ο πίνακας m έχει ορίζουσα μηδενική οπότε δεν έχει αντίστροφο

Συνάρτηση apply() σε πίνακα - Παράδειγμα (1)

  • apply(<πίνακας x>, 1 , <συνάρτηση f>) : εφάρμοσε την συνάρτηση f στα στοιχεία κάθε γραμμής του πίνακα x
  • apply(<πίνακας x>, 2 , <συνάρτηση f>) : εφάρμοσε την συνάρτηση f στα στοιχεία κάθε στήλης του πίνακα x
  • > x<-matrix(1:6, ncol=2)
    > x
         [,1] [,2]
    [1,]    1    4
    [2,]    2    5
    [3,]    3    6
    > y<-apply(x, 1, sum) # Αθροίζει τα στοιχεία κάθε γραμμής
    > y
    [1] 5 7 9 
    > z<-apply(x, 2, sum) # Αθροίζει τα στοιχεία κάθε στήλης 
    > z
    [1]  6 15 
    Η πρώτη apply αθροίζει τα στοιχεία κάθε γραμμής του πίνακα και το αποτέλεσμα αποθηκεύεται σε ένα διάνυσμα y ενώ η δεύτερη apply αθροίζει τα στοιχεία κάθε στήλης του πίνακα και το αποτέλεσμα αποθηκεύεται σε ένα διάνυσμα z.

Συνάρτηση apply() σε πίνακα - Παράδειγμα (2)

  • Συνένωση αρχικού πίνακα με τα αθροίσματα γραμμών και στηλών:
  • > k<-cbind(x,y)
    > k
             y
    [1,] 1 4 5
    [2,] 2 5 7
    [3,] 3 6 9   
    Συνένωση του αρχικού πίνακα με τα αθροίσματα γραμμών - διάνυσμα y (επιπλέον στήλη)
    > l<-rbind(x,z)
    > l
      [,1] [,2]
         1    4
         2    5
         3    6
    z    6   15 
    Συνένωση του αρχικού πίνακα με τα αθροίσματα στηλών - διάνυσμα z (επιπλέον γραμμή)
Συνάρτησεις αθροίσματος και μέσης τιμής για γραμμές και στήλες πίνακα (1)
  • Για τα αθροίσματα και τις μέσες τιμές που αφορούν στις διαστάσεις ενός πίνακα x υπάρχουν οι παρακάτω συναρτήσεις συντόμευσης που στηρίζονται στη συνάρτηση apply().
    • rowSums = apply(x, 1, sum)
    • rowMeans = apply(x, 1, mean)
    • colSums = apply(x, 2, sum)
    • colMeans = apply(x, 2, mean)
  • Οι συναρτήσεις αυτές είναι πολύ πιο γρήγορες αλλά αυτό γίνεται αντιληπτό μόνο σε ένα πολύ μεγάλο πίνακα.
Συνάρτησεις αθροίσματος και μέσης τιμής για γραμμές και στήλες πίνακα (2)
  • Παραδείγματα με τις συνάρτησεις αθροίσματος και μέσης τιμής για γραμμές και στήλες πίνακα:
  • > x<-matrix(1:6, ncol=2)
    > x
         [,1] [,2]
    [1,]    1    4
    [2,]    2    5
    [3,]    3    6
    > rowSums(x)
    [1] 5 7 9
    > rowMeans(x)
    [1] 2.5 3.5 4.5
    > colSums(x)
    [1]  6 15
    > colMeans(x)
    [1] 2 5 

Arrays (1)

  • Είναι πίνακες με 3 ή περισσότερες διαστάσεις.
  • Δημιουργία : Με την συνάρτηση array()
  • > A<-array(letters[1:24], c(4,2,3))
    > A
    , , 1
    
         [,1] [,2]
    [1,] "a"  "e" 
    [2,] "b"  "f" 
    [3,] "c"  "g" 
    [4,] "d"  "h" 
    
    , , 2
    
         [,1] [,2]
    [1,] "i"  "m" 
    [2,] "j"  "n" 
    [3,] "k"  "o" 
    [4,] "l"  "p" 
    
    , , 3
    
         [,1] [,2]
    [1,] "q"  "u" 
    [2,] "r"  "v" 
    [3,] "s"  "w" 
    [4,] "t"  "x" 
    > class(A)
    [1] "array"
    > mode(A)
    [1] "character" 
    Δημιουργείται ένας τριών διαστάσεων πίνακας όπου κάθε στοιχείο του είναι ένας 4Χ2 πίνακας. Παρατηρήστε τα αποτελέσματα class(A) και mode(A)

Arrays (2)

  • Δημιουργία : Δίνοντας σε ένα απλό διάνυσμα τρεις διαστάσεις
  • > B<-c(1:24); dim(B)=c(4,2,3)
    > B
    , , 1
    
         [,1] [,2]
    [1,]    1    5
    [2,]    2    6
    [3,]    3    7
    [4,]    4    8
    
    , , 2
    
         [,1] [,2]
    [1,]    9   13
    [2,]   10   14
    [3,]   11   15
    [4,]   12   16
    
    , , 3
    
         [,1] [,2]
    [1,]   17   21
    [2,]   18   22
    [3,]   19   23
    [4,]   20   24  

Arrays - Υποσύνολα- Παραδείγματα (1)

  • Θέλουμε να πάρουμε τον αριθμό 17 από το προηγούμενο array, δηλαδή το στοιχείο που βρίσκεται στην 1η γραμμή, 1η στήλη του 3ου πίνακα.
  • > B[1,1,3]
    [1] 17  

Arrays - Υποσύνολα- Παραδείγματα (2)

  • Θέλουμε να πάρουμε τους αριθμούς από το 1 έως το 16 του array B. Αυτοί είναι όλες οι γραμμές και οι στήλες των δύο πρώτων πινάκων του array.
  •  > B[,,1:2]
    , , 1
    
         [,1] [,2]
    [1,]    1    5
    [2,]    2    6
    [3,]    3    7
    [4,]    4    8
    
    , , 2
    
         [,1] [,2]
    [1,]    9   13
    [2,]   10   14
    [3,]   11   15
    [4,]   12   16
Arrays - Υποσύνολα- Παραδείγματα (3)
  • Θέλουμε να πάρουμε τους αριθμούς 3,7, 11, 15 και 19, 23 δηλαδή την 3η γραμμή από κάθε πίνακα του array B.
  • > B[3,,]
         [,1] [,2] [,3]
    [1,]    3   11   19
    [2,]    7   15   23  
    Έτσι απλοποιείται by default το αποτέλεσμα (καταργείται η τρίτη διάσταση). Για να πάρουμε το αποτέλεσμα στην αρχική διάσταση χρησιμοποιυμε το drop=FALSE.
    > B[3,, ,drop=F]
    , , 1
    
         [,1] [,2]
    [1,]    3    7
    
    , , 2
    
         [,1] [,2]
    [1,]   11   15
    
    , , 3
    
         [,1] [,2]
    [1,]   19   23

Arrays - Υποσύνολα- Παραδείγματα (4)

  • Έστω ότι θέλουμε να πάρουμε από τον array B την 2η στήλη του 1ου πίνακα δηλ. B[,2,1] , την 1η στήλη του 2ου πίνακα δηλ. B[,1,2] και την 2η στήλη του 3ου πίνακα δηλ. B[,2,3]. Για την συνένωση υποσυνόλων του array θα χρησιμοποιήσω την συνάρτηση sapply()
    • sapply(διάνυσμα x, συνάρτηση f) : Η συνάρτηση f εφαρμόζεται σε κάθε στοιχείο του διανύσματος
    > cs<-c(2,1,2) # Οι διαφορετικές στήλες
    > ts<-c(1,2,3) # Οι διαφορετικοί πίνακες 
    > sapply (1:3, function(i) B[,cs[i],ts[i]]) 
         [,1] [,2] [,3]
    [1,]    5    9   21
    [2,]    6   10   22
    [3,]    7   11   23
    [4,]    8   12   24 
    Επειδή σε κάθε περίπτωση θέλουμε όλες τις γραμμές αλλά διαφορετικές στήλες (cs) σε διαφορετικούς πίνακες (ts) θέτουμε τα ανάλογα διανύσματα και χρησιμοποιώ την sapply για την συνένωση από τους 3 πίνακες. Αν χρησιμοποιούσα την lapply θα είχα το αποτέλεσμα σε λίστα

Arrays - Υποσύνολα- Παραδείγματα (5)

  • Το προηγούμενο παράδειγμα της συνένωσης υποσυνόλων του array Β πιο απλά με την συνάρτηση cbind()
  • > cbind(B[,2,1], B[,1,2], B[,2,3])
         [,1] [,2] [,3]
    [1,]    5    9   21
    [2,]    6   10   22
    [3,]    7   11   23
    [4,]    8   12   24 
    Ενώνει τις διαφορετικές στήλες.

Arrays - Υποσύνολα- Παραδείγματα (6)

  • Για να πάρω την ακριβή θέση ενός στοιχείου του array χρησιμοποιώ την συνάρτηση arrayInd(), η οποία παίρνει ως όρισμα την θέση (index) του στοιχείου.
  • Παράδειγμα: Θα βρω την ακριβή θέση του στοιχείου k στον πίνακα A
    > A 
    ....................................
    , , 2
         [,1] [,2]
    [1,] "i"  "m" 
    [2,] "j"  "n" 
    [3,] "k"  "o" 
    [4,] "l"  "p" 
    .....................................
    > which(A=="k")
    [1] 11
    > arrayInd(which(A=="k"), dim(A))
         [,1] [,2] [,3]
    [1,]    3    1    2

Λίστες(1)

  • Οι λίστες είναι γενικής μορφής διανύσματα όπου τα στοιχεία τους δεν χρειάζεται να είναι του ίδιου τύπου (δομής)
  • Πολλές φορές καθένα από τα στοιχεία μιας λίστας είναι ένα διάνυσμα ή λίστα.

Λίστες (2)

  • Δημιουργία : Με την συνάρτησηση list()
  • > m<-1:6 ; dim(m)<-c(2,3) # Δημιουργώ πίνακα
    > y<-list(c(1,2,3,4,5), m, "aaa", 5, T, 3+2i)
    > y
    [[1]]
    [1] 1 2 3 4 5
    
    [[2]]
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    
    [[3]]
    [1] "aaa"
    
    [[4]]
    [1] 5
    
    [[5]]
    [1] TRUE
    
    [[6]]
    [1] 3+2i 
    Παρατηρήστε ότι κάθε στοιχείο της παριστάνετε με διπλή αγκύλη [[ ]].

Λίστες (3)

  • str(y): παίρνω πληροφορίες για την δομή της λίστας
  • > str(y)
    List of 6
     $ : num [1:5] 1 2 3 4 5
     $ : int [1:2, 1:3] 1 2 3 4 5 6
     $ : chr "aaa"
     $ : num 5
     $ : logi TRUE
     $ : cplx 3+2i 

Λίστες - Ονόματα στοιχείων (1)

  • Δίνω ονόματα των στοιχείων της λίστας κατά τον ορισμό της.
  • > y<-list(my_vector=c(1,2,3,4,5), my_matrix=m, my_char="aaa", my_num=5, my_logical=T, my_complex=3+2i)
    > y
    $my_vector
    [1] 1 2 3 4 5
    
    $my_matrix
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    
    $my_char
    [1] "aaa"
    
    $my_num
    [1] 5
    
    $my_logical
    [1] TRUE
    
    $my_complex
    [1] 3+2i
  • Δίνω όνοματα στα στοιχεία μιας λίστας αργότερα με την συνάρτηση names()
  • > names(y)<-c("my_vector", "my_matrix", "my_num", "my_logical", "my_complex") 

Λίστες - Ονόματα στοιχείων (2)

  • Δίνω όνομα σε μεμονωμένο στοιχείο της λίστας με την συνάρτηση names()
  • > names(y)[1]<-"a" # Δίνω όνομα στο 1ο στοιχείο της λίστας
    > y
    $a
    [1] 1 2 3 4 5
    
    $my_matrix
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    
    $my_char
    [1] "aaa"
    
    $my_num
    [1] 5
    
    $my_logical
    [1] TRUE
    
    $my_complex
    [1] 3+2i

Λίστες - Υποσύνολα (1)

  • [[]] : χρησιμοποιώ για να πάρω τα στοιχεία που περιέχει η λίστα.
  • > y[[2]] # Παίρνω το 2ο στοιχείο της λίστας
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6 
    > y[[2]][1,3]  # Από το 2ο στοιχείο της λίστας παίρνω το [1,3] στοιχείο του πίνακα
    [1] 5 
    > y[[3]]
    [1] "aaa" 
    > y[[1]]
    [1] 1 2 3 4 5
    > y[[1]][4]
    [1] 4 
    Παρατηρήστε ότι με [[αριθμο στοιχείου]] παίρνω ολόκληρο το στοιχείο της λίστας με τον αντίστοιχο αριθμό. Ενώ στο δεύτερο παράδειγμα από το συγκεκριμένο στοιχείο που είναι πίνακας παίρνω το στοιχείο που βρίσκεται στη 1η γραμμή και στην 3η στήλη δίνοντας πρώτα το στοιχείο της λίστας και μετά κατά τα γνωστά το στοιχείο του πίνακα.

Λίστες - Υποσύνολα (2)

  • $ : χρησιμοποιώ για να πάρω στοιχείο της λίστας αν έχει δικό του όνομα.
  • > y$my_matrix
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6
    > y$my_matrix[1,3]
    [1] 5
    > y$my_m[1,3] # Δεν χρειάζεται να γράψω ολόκληρο το όνομα 
    [1] 5 
    Παρατηρήστε ότι δεν χρειάζεται να γράψουμε ολόκληρο το όνομα του αντικειμένου αλλά μόνο τα απαραίτητα για τον διαχωρισμό του
  • Αν έχει όνομα το στοιχείo της λίστας μπορώ να γράψω και [["όνομα"]] :
  • > y[["my_matrix"]][1,3]
    [1] 5  

Λίστες - Υποσύνολα (3)

    Παρατηρήστε την διαφορά
    > y[3]
    $my_char
    [1] "aaa"
    
    > y[[3]] 
    [1] "aaa"
  • y[3] : Δίνει μία υπό-λίστα της λίστας y που περιέχει μόνο το 3ο αντικείμενο της y (μαζί με το όνομα του).
  • y[[3]] : Δίνει το 3ο αντικείμενο της λίστας του οποίου το όνομα (αν υπάρχει) δεν συμπεριλαμβάνεται.
  • > class(y[3])
    [1] "list"
    > class(y[[3]])
    [1] "character"
    Οι μονές αγγύλες [] δίνουν ίδιου τύπου αντικείμενο ενώ οι διπλές [[]] δίνουν το περιεχόμενο του

Πλαίσια Δεδομένων

  • Τα πλαίσια δεδομένων (data frames) είναι αντικείμενα που σχεδιάστηκαν για στατιστική ανάλυση.
  • Είναι μία λίστα από διανύσματα όπου κάθε ένα μπορεί να είναι διαφορετικού τύπου αλλά όλα έχουν το ίδιο μήκος.
  • Είναι πίνακας όπου οι στήλες του μπορεί να είναι διανύσματα διαφορετικού τύπου.
  • Κάθε γραμμή είναι μία παρατήρηση και κάθε στήλη μία μεταβλητή.
  • Γραμμές --> Παρατηρήσεις, Στήλες--> Μεταβλητές.

Πλαίσια Δεδομένων - Δημιουργία

  • Με την συνάρτηση data.frame()

> df<- data.frame( id=c("Marc", "Mary", "Kelly", "George", "Peter"),sex=c("Male","Female", "Female", "Male","Male"), height=c(180, 160, 167, 175, 190), smoking=c(T,F,F,T,F))
> df
      id    sex height smoking
1   Marc   Male    180    TRUE
2   Mary Female    160   FALSE
3  Kelly Female    167   FALSE
4 George   Male    175    TRUE
5  Peter   Male    190   FALSE  

Δομή Πλαισίου Δεδομένων

  • str(): Παίρνω την δομή του πλαίσιου δεδομένων
  • > str(df)
    'data.frame':	5 obs. of  4 variables:
     $ id     : Factor w/ 5 levels "George","Kelly",..: 3 4 2 1 5
     $ sex    : Factor w/ 2 levels "Female","Male": 2 1 1 2 2
     $ height : num  180 160 167 175 190
     $ smoking: logi  TRUE FALSE FALSE TRUE FALSE 
    Παρατηρώ ότι η R όλα τα τύπου character τα θεωρεί ως factor. Για να το αλλάξω:
    > df$id<-as.character(df$id)
    > str(df)
    'data.frame':	5 obs. of  4 variables:
     $ id     : chr  "Marc" "Mary" "Kelly" "George" ...
     $ sex    : Factor w/ 2 levels "Female","Male": 2 1 1 2 2
     $ height : num  180 160 167 175 190
     $ smoking: logi  TRUE FALSE FALSE TRUE FALSE  

Πλαίσια Δεδομένων - Χρήσιμες συναρτήσεις (1)

  • names(): Δίνει τα ονόματα των στηλών- μεταβλητών
  • rownames() : Δίνει τα ονόματα των γραμμών-παρατηρήσεων (Μπορούμε να τα ορίσουμε)
  • dim() : Δίνει την διάσταση του πλαισίου δεδομένων Γραμμές Χ Στήλες
  • nrow() : Δίνει τον αριθμό των γραμμών-παρατηρήσεων
  • ncol() : Δίνει τον αριθμό των στηλών-μεταβλητών
  • > names(df)
    [1] "id"      "sex"     "height"  "smoking"
    > rownames(df)
    [1] "1" "2" "3" "4" "5"
    > dim(df)
    [1] 5 4
    > nrow(df)
    [1] 5
    > ncol(df)
    [1] 4  

Πλαίσια Δεδομένων - Χρήσιμες συναρτήσεις (2)

  • head() : Δίνει τα πρώτα στοιχεία από το πλαίσιο δεδομένων
  • tail() : Δίνει τα τελευταία στοιχεία από το πλαίσιο δεδομένων
  • > head(df)
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE
    > tail(df)
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE 
    Στην προκειμένη περίπτωση επειδή οι παρατηρήσεις είναι πολύ λίγες δίνει όλο το πλαίσιο δεδομένων.

Πλαίσια Δεδομένων - Χρήσιμες συναρτήσεις (3)

  • Για να πάρω π.χ. τις 2 πρώτες γραμμές του πλαισίου δεδομένων το ορίζω στην συνάρτηση head() δηλ. head(df,2)
    > head(df,2) 
        id    sex height smoking
    1 Marc   Male    180    TRUE
    2 Mary Female    160   FALSE
    > df[1:2,]
        id    sex height smoking
    1 Marc   Male    180    TRUE
    2 Mary Female    160   FALSE 
    Με df[1:2,] παίρνω το ίδιο αποτέλεσμα θεωρώντας το πλαίσιο δεδομένων ως πίνακα.

Πλαισία δεδομένων - Υποσύνολα (1)

  • $ ή [[]] και το όνομα της μεταβλητής : χρησιμοποιώ για να πάρω τα στοιχεία της μεταβλητής του πλαισίου δεδομένων θεωρώντας το ως λίστα
  • []: χρησιμοποιώ για να πάρω μέρος του πλαισίου δεδομένων θεωρώντας το ως πίνακα.
  • Παραδείγματα:
    > df$id
    [1] "Marc"   "Mary"   "Kelly"  "George" "Peter" 
    > df$height
    [1] 180 160 167 175 190
    > df[["height"]]
    [1] 180 160 167 175 190 
    
    Ο πιο σύνηθες τρόπος να πάρω τις τιμές μιας μεταβλητής ενός πλαισίου δεδομένων είναι <Όνομα πλαισίου δεδομένων>$<όνομα μεταβλητής>

Πλαισία δεδομένων - Υποσύνολα (2)

  • Παραδείγματα:
  • > df[["height"]]
    [1] 180 160 167 175 190 
    > df["height"]
      height
    1    180
    2    160
    3    167
    4    175
    5    190 
    > class(df["height"])
    [1] "data.frame"
    > mode(df["height"])
    [1] "list"  
    Παρατηρήστε ότι τα διπλά [[]] δίνουν το περιέχομενο της μεταβλητής height (ένα numeric διάνυσμα) ενώ τα μονά [] μας δίνουν ίδιου τύπου αντικείμενο με το df δηλαδή το df["height"] είναι ένα πλαίσιο δεδομένων που περιέχει μόνο ένα στοιχείο που είναι λίστα, η μεταβλητη height.

Πλαισία δεδομένων - Υποσύνολα (3)

  • Παραδείγματα θεωρώντας το πλαίσιο δεδομένων ως πίνακα
  • > df[3,] # πλαίσιο δεδομένων με την 3η παρατήρηση
         id    sex height smoking
    3 Kelly Female    167   FALSE
    > df[,3]   # Οι τιμές της 3ης μεταβλητής του πλαισίου 
    [1] 180 160 167 175 190
    > df[,"height"]   # Οι τιμές της μεταβλητής height του πλαισίου 
    [1] 180 160 167 175 190
    > df[3,2]    # Συγκεκριμένο στοιχείο του πλαισίου
    [1] Female
    Levels: Female Male
    > df[3,"sex"]
    [1] Female
    Levels: Female Male 
    Παρατηρήστε ότι μία παρατήρηση π.χ. η df[3, ] δεν μπορεί να αποτελεί διάνυσμα (όπως γίνεται με οποιαδήποτε στήλη-μεταβλητή του πλαισίου δεδομένων) γιατί αποτελείται από διαφορετικού τύπου τιμές

Πλαισία δεδομένων - Υποσύνολα (4)

Συνδιαστικά παραδείγματα:
  • Έστω ότι θέλω όλα τα δεδομένα (του df) αυτών που έχουν ύψος μεγαλύτερο του 160
  • > df[df$height>160,] 
          id    sex height smoking
    1   Marc   Male    180    TRUE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE 
    Όλο το πλαίσιο δεδομένων είναι ένας πίνακας. Δίνουμε κριτήριο για τις γραμμές του, βάζουμε κόμμα και δεν γράφουμε τίποτα για στήλη για να τις πάρουμε όλες.
  • Έστω ότι θέλω μόνο τα ονόματα αυτών που έχουν ύψος μεγαλύτερο του 160
  • > df$id[df$height>160]  
    [1] "Marc"   "Kelly"  "George" "Peter" 
    Τα ονόματα είναι στοιχεία της μεταβλητής id που είναι ένα διάνυσμα. Δεν γράφουμε γραμμές και στήλες με διαχωριστικό το κόμμα, γιατί δεν είναι πίνακας παρά μόνο δίνουμε κριτήριο για τις τιμές του διανύσματος.

Πλαισία δεδομένων - Υποσύνολα (5)

Συνδιαστικά παραδείγματα:
  • Έστω ότι θέλω όλα τα δεδομένα αυτών που έχουν ύψος μεγαλύτερο του 160 και είναι γυναίκες
  • > df[df$h>160 & df$sex=="Female",] 
         id    sex height smoking
    3 Kelly Female    167   FALSE 
  • Έστω ότι θέλω μόνο τα ονόματα αυτών που έχουν ύψος μεγαλύτερο του 160 και είναι γυναίκες
  • > df$id[df$h>160 & df$sex=="Female"] 
    [1] "Kelly"

Πλαισία δεδομένων - Υποσύνολα (6)

Συναρτήσεις με συνδιαστικά παραδείγματα:
  • H μέση τιμή ύψους των γυναικών
  • > mean(df$height[df$sex=="Female"])
    [1] 163.5
  • Tο μέγιστο ύψος αυτών που καπνίζουν
  • > max(df$height[df$smoking==T])
    [1] 180

Προσθήκη στήλης - μεταβλητής σε πλαίσιο δεδομένων (1)

  • Παράδειγμα:
  • > weight=c(80, 60, 65,  100 , 85) # δημιουργώ το διάνυσμα με τα βάρη στην σειρά
    > df2<-df  # Κρατάω το dataframe df και με ένα άλλο όνομα για να κάνω αλλαγές
    > df2
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE
    > df2$weight<- weight # Δημιουργώ νέα στήλη στο df2 και της δίνω τις τιμές του διανύσματος weight
    > df2
          id    sex height smoking weight
    1   Marc   Male    180    TRUE     80
    2   Mary Female    160   FALSE     60
    3  Kelly Female    167   FALSE     65
    4 George   Male    175    TRUE    100
    5  Peter   Male    190   FALSE     85 
    Δημιουργώ νέα στήλη

Προσθήκη στήλης - μεταβλητής σε πλαίσιο δεδομένων (2)

Παράδειγμα:
  • Έστω ότι ήθελα να αφαιρέσω μία στήλη π.χ. την weight
  • > df2<-df2[,-5]
    > df2
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE 
  • και στη συνέχεια να την ξαναπροσθέσω ισοδύναμα
  • > df2[["weight"]]<- weight
    > df2
          id    sex height smoking weight
    1   Marc   Male    180    TRUE     80
    2   Mary Female    160   FALSE     60
    3  Kelly Female    167   FALSE     65
    4 George   Male    175    TRUE    100
    5  Peter   Male    190   FALSE     85 
    Δημιουργώ νέα στήλη

Προσθήκη στήλης - μεταβλητής σε πλαίσιο δεδομένων (3)

  • Προσθέση στήλης σε πλαίσιο δεδομένων χρησιμοποιώντας την συνάρτηση cbind() που εφαρμόζεται στα πλαίσια δεδομένων με τον ίδιο τρόπο που εφαρμόζεται στους πίνακες. Παράδειγμα:
  • > df2<-df2[,-5] # Αφαιρώ την στήλη weight από το df2
    > df2
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE
    > dfc<-cbind(df2,weight) # Προσθέτω το διάνυσμα weight ως στήλη στο df2 και δημιουργώ νέο dataframe
    > dfc
          id    sex height smoking weight
    1   Marc   Male    180    TRUE     80
    2   Mary Female    160   FALSE     60
    3  Kelly Female    167   FALSE     65
    4 George   Male    175    TRUE    100
    5  Peter   Male    190   FALSE     85 
    Η cbind() συνενώνει διάνυσμα με πλαίσιο δεδομένων και δημιουργεί νέα στήλη

Προσθήκη γραμμής-παρατήρησης σε πλαίσιο δεδομένων

  • Προσθέση γραμμής σε πλαίσιο δεδομένων χρησιμοποιώντας την συνάρτηση rbind() που εφαρμόζεται στα πλαίσια δεδομένων με τον ίδιο τρόπο που εφαρμόζεται στους πίνακες. Παράδειγμα:
  • > john<-list(id="John", sex="Male", height=195, weight=95, smoking=F) # Νέα γραμμή
    > total<-rbind(dfc,john) # Συνένωση λίστας με πλαίσιο δεδομένων
    > total
          id    sex height smoking weight
    1   Marc   Male    180    TRUE     80
    2   Mary Female    160   FALSE     60
    3  Kelly Female    167   FALSE     65
    4 George   Male    175    TRUE    100
    5  Peter   Male    190   FALSE     85
    6   John   Male    195   FALSE     95 
    Παρατηρήστε ότι έχω μια νέα γραμμή ως λίστα (ή ως data frame θα μπορούσε να ήταν) και όχι ως διάνυσμα γιατί περιέχει διαφορετικού τύπου στοιχεία. Η rbind() συνενώνει λίστα με πλαίσιο δεδομένων και δημιουργεί νέα γραμμή

Συνένωση δύο πλαισίων δεδομένων (1)

  • Παράδειγμα προσθήκης γραμμής που δίνεται ως data frame:
  • > john<-data.frame(id="John", sex="Male", height=195, weight=95, smoking=F) # Νέα γραμμή ως data frame
    > john
        id  sex height weight smoking
    1 John Male    195     95   FALSE
    > dfcr<-rbind(dfc,john) # Συνένωση δύο πλαισίων δεδομένων
    > dfcr
          id    sex height smoking weight
    1   Marc   Male    180    TRUE     80
    2   Mary Female    160   FALSE     60
    3  Kelly Female    167   FALSE     65
    4 George   Male    175    TRUE    100
    5  Peter   Male    190   FALSE     85
    6   John   Male    195   FALSE     95 
    Η νέα γραμμή δίνεται ως data frame. Η rbind() συνενώνει δύο πλαίσια δεδομένων και δημιουργεί νέα γραμμή (θα μπορούσε και περισσότερες).

Συνένωση δύο πλαισίων δεδομένων (2)

  • Παράδειγμα πρόσθεσης δύο πλαισίων δεδομένων με κοινή στήλη
  • > df2
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE
    > df1<- data.frame( id=c("Mary", "Marc", "Peter", "George", "Kelly"), weight=c(60, 80, 85, 100, 65))
    > dfwrong<-cbind(df2,df1) 
    > dfwrong
          id    sex height smoking     id weight
    1   Marc   Male    180    TRUE   Mary     60
    2   Mary Female    160   FALSE   Marc     80
    3  Kelly Female    167   FALSE  Peter     85
    4 George   Male    175    TRUE George    100
    5  Peter   Male    190   FALSE  Kelly     65 
Η cbind() συνενώνει δύο πλαίσια δεδομένων χωρίς επεξεργασία για κοινές στήλες

Συνένωση δύο πλαισίων δεδομένων (3)

  • Συνένωση δύο πλαισίων δεδομένων με βάση κοινή μεταβλητή. Παράδειγμα:
  • > df2
          id    sex height smoking
    1   Marc   Male    180    TRUE
    2   Mary Female    160   FALSE
    3  Kelly Female    167   FALSE
    4 George   Male    175    TRUE
    5  Peter   Male    190   FALSE
    > df1<- data.frame( id=c("Mary", "Marc", "Peter", "George", "Kelly"), weight=c(60, 80, 85, 100, 65))
    > df12<-merge(df2, df1, by="id")
    > df12
          id    sex height smoking weight
    1 George   Male    175    TRUE    100
    2  Kelly Female    167   FALSE     65
    3   Marc   Male    180    TRUE     80 
    4   Mary Female    160   FALSE     60
    5  Peter   Male    190   FALSE     85
    Η merge() συνενώνει δύο πλαίσια δεδομένων με βάση την κοινή μεταβλητή id

Συναρτήσεις ταξινόμησης σε διάνυσμα (1)

  • sort(): Ταξινομεί τις τιμές ενός διανύσματος κατά αύξουσα σειρά.
  • sort( , decreasing=T): Ταξινομεί τις τιμές ενός διανύσματος κατά φθίνουσα σειρά.
  • Παράδειγμα:
    > total$weight
    [1]  80  60  65 100  85  95
    > sort(total$weight)
    [1]  60  65  80  85  95 100
    > sort(total$weight, decreasing=T)
    [1] 100  95  85  80  65  60  

Συναρτήσεις ταξινόμησης σε διάνυσμα (2)

  • rank() : Δίνει την σειρά κατάταξης των τιμών ενός διανύσματος
  • > total$weight
    [1]  80  60  65 100  85  95
    > sort(total$weight)
    [1]  60  65  80  85  95 100
    > rank(total$weight)
    [1] 3 1 2 6 4 5  
    Παρατηρήστε ότι το 80 που είναι το πρώτο στο διάνυσμα weight βρίσκεται στην 3η θέση όταν το διάνυσμα ταξινομηθεί, το 60 βρίσκεται στην 1η θέση του ταξινομημένου διανύσματος κ.ο.κ.

Συναρτήσεις ταξινόμησης σε διάνυσμα (3)

  • order() : Eπιστρέφει μια μετάθεση που αναδιατάσσει το αρχικό διάνυσμα σε αύξουσα (ή φθίνουσα σειρά). Δηλαδή, ταξινομεί τις τιμές ενός διανύσματος, αναδιατάσσει το διάνυσμα και δίνει την θέση (index) των τιμών που είχαν στο αρχικό διάνυσμα
  • > total$weight
    [1]  80  60  65 100  85  95
    > sort(total$weight)
    [1]  60  65  80  85  95 100
    > rank(total$weight)
    [1] 3 1 2 6 4 5
    > order(total$weight)
    [1] 2 3 1 5 6  
    Παρατηρήστε έχοντας κατά νου το ταξινομημένο διάνυσμα (60, 65, 80, 85, 95, 100) ότι το 60 που είναι ο πρώτος αριθμός στο ταξινομημένο διάνυσμα βρίσκεται στη θέση 2 στο διάνυσμα weight, το 65 είναι στη θέση 3 στο διάνυσμα weight κοκ

Συνάρτηση ταξινόμησης σε πλαίσιο δεδομένων

  • Για να ταξινομήσουμε ένα πλαίσιο δεδομένων ως προς μια μεταβλητή χρησιμοποιώ την συνάρτηση order() για την μεταβλητή.
  • Παράδειγμα:
    > total[order(total$weight),]
          id    sex height smoking weight
    2   Mary Female    160   FALSE     60
    3  Kelly Female    167   FALSE     65
    1   Marc   Male    180    TRUE     80
    5  Peter   Male    190   FALSE     85
    6   John   Male    195   FALSE     95
    4 George   Male    175    TRUE    100 
    Ταξινομώ ολόκληρο το data frame total ανά weight σε αύξουσα σειρά

Συναρτήσεις attach(), detach() σε πλαίσια δεδομένων (1)

  • Κάνοντας attach() ένα πλαίσιο δεδομένων δημιουργούμε ένα virtual copy των αντικειμένων του πλαισίου δεδομένων και μπορούμε να τα προσπελάσουμε απευθείας χωρίς να απαιτείται η χρήση του $ (στην περίπτωση που δεν υπάρχει άλλο αντικείμενο με το ίδιο όνομα). Παράδειγμα:
  • > attach(total)
    The following objects are masked _by_ .GlobalEnv:
    
        height, id, weight
    
    > smoking
    [1]  TRUE FALSE FALSE  TRUE FALSE FALSE
    > height
     Mary  Anna  John Peter 
      160   170   180   190 
    > total$height
    [1] 180 160 167 175 190 195  
    Παρατηρήστε ότι το αντικείμενο height υπάρχει ήδη στο περιβάλλον. Ομοίως και τα id και weight που τα είχαμε ορίσει νωρίτερα

Συναρτήσεις attach(), detach() σε πλαίσια δεδομένων (2)

  • Προσοχή: Στην περίπτωση που έχω χρησιμοποιήσει την συνάρτηση attach(), αν θέλω να κάνω αλλαγές σε ένα αντικείμενο του πλαισίου δεδομένων, οι αλλαγές αυτές δεν αποθηκεύονται στα αρχικά αντικείμενα. Μόνο όταν χρησιμοποιώ ολόκληρο το όνομα με το $ γίνεται η αλλαγή.
  • Κάνοντας detach() το πλαίσιο δεδομένων επαναφερόμαστε στην αρχική κατάσταση.
  • > detach(total)
    > smoking
    Error: object 'smoking' not found
    > total$smoking
    [1]  TRUE FALSE FALSE  TRUE FALSE FALSE