Άννα Μοσχά Κέντρο Η/Υ, Ε.Μ.Π.
> 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
> x<-vector(mode="numeric", length=5)
> x
[1] 0 0 0 0 0
> 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
> 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"
> y<- scan()
1: 10
2: 2
3: 3
4:
Read 3 items
> y
[1] 10 2 3
> 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'
> y<- scan(what=character())
1: f
2: d
3: anna
4: lalal
5:
Read 4 items
> y
[1] "f" "d" "anna" "lalal"
> 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
> 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"
> paste("A", 1:6, sep= "")
[1] "A1" "A2" "A3" "A4" "A5" "A6"
> sample(LETTERS,5)
[1] "M" "C" "Z" "E" "G"
Από τα κεφαλαία γράμματα του αλφαβήτου μας δίνει τυχαία 5 χωρίς επανάθεση.
> sample(1:20, 5, replace=TRUE)
[1] 15 10 15 15 3
> 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 πλέον θα μου επιστρέψει τους ίδιους αριθμούς που μου επέστρεψε όταν πρωτοχρησιμοποιήθηκε.
> 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
> 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
> 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
> sum(x); prod(x)
[1] 174
[1] 1.369513e+24
> 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(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 2.00 4.00 3.48 5.00 6.00
> plot(x)
> 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(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"
> 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
> paste("A", "BBBBB", "CCCCC", sep= "")
[1] "ABBBBBCCCCC"
> x<-paste("A", 1:6, sep= "")
> x
[1] "A1" "A2" "A3" "A4" "A5" "A6"
> grep('A', x)
[1] 1 2 3 4 5 6
> grep('A', x,value=T)
[1] "A1" "A2" "A3" "A4" "A5" "A6"
> grep('2', x)
[1] 2
> grep('2', x,value=T)
[1] "A2"
> y<-sub('A','B',x)
> y
[1] "B1" "B2" "B3" "B4" "B5" "B6"
> 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
> class(f)
[1] "factor"
> mode(f)
[1] "numeric"
> str(f)
Factor w/ 2 levels "Male","Female": 1 2 2 1 1
> k <- factor(LETTERS[3:1], ordered = TRUE)
> k
[1] C B A
Levels: A < B < C
> 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"
> 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
> 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
> 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
> 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
> 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
> m[,-3]
[,1] [,2]
[1,] 1 10
[2,] 2 11
[3,] 3 12
> attributes(m)
$dim
[1] 3 3
> k2
[1] 1 4 5 6 7 8 9 10 10 20 30 40
> attributes(k2)
NULL
> 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(m)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 10 11 12
[3,] 100 200 300
> 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 έχει ορίζουσα μηδενική οπότε δεν έχει αντίστροφο
> 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.
> k<-cbind(x,y)
> k
y
[1,] 1 4 5
[2,] 2 5 7
[3,] 3 6 9
> l<-rbind(x,z)
> l
[,1] [,2]
1 4
2 5
3 6
z 6 15
> 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
> 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)
> 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
> B[1,1,3]
[1] 17
> 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
> 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
> 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 θα είχα το αποτέλεσμα σε λίστα
> 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
Ενώνει τις διαφορετικές στήλες.
> 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
> 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
Παρατηρήστε ότι κάθε στοιχείο της παριστάνετε με διπλή αγκύλη [[ ]].
> 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
> 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(y)<-c("my_vector", "my_matrix", "my_num", "my_logical", "my_complex")
> 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
> 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η στήλη δίνοντας πρώτα το στοιχείο της λίστας και μετά κατά τα γνωστά το στοιχείο του πίνακα.
> 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
Παρατηρήστε ότι δεν χρειάζεται να γράψουμε ολόκληρο το όνομα του αντικειμένου αλλά μόνο τα απαραίτητα για τον διαχωρισμό του
> y[["my_matrix"]][1,3]
[1] 5
> y[3]
$my_char
[1] "aaa"
> y[[3]]
[1] "aaa"
> class(y[3])
[1] "list"
> class(y[[3]])
[1] "character"
Οι μονές αγγύλες [] δίνουν ίδιου τύπου αντικείμενο ενώ οι διπλές [[]] δίνουν το περιεχόμενο του
Γραμμές --> Παρατηρήσεις, Στήλες--> Μεταβλητές.
> 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(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
> 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
> 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
Στην προκειμένη περίπτωση επειδή οι παρατηρήσεις είναι πολύ λίγες δίνει όλο το πλαίσιο δεδομένων.
> 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,] παίρνω το ίδιο αποτέλεσμα θεωρώντας το πλαίσιο δεδομένων ως πίνακα.
> df$id
[1] "Marc" "Mary" "Kelly" "George" "Peter"
> df$height
[1] 180 160 167 175 190
> df[["height"]]
[1] 180 160 167 175 190
Ο πιο σύνηθες τρόπος να πάρω τις τιμές μιας μεταβλητής ενός πλαισίου δεδομένων είναι <Όνομα πλαισίου δεδομένων>$<όνομα μεταβλητής>
> 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.
> 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, ] δεν μπορεί να αποτελεί διάνυσμα (όπως γίνεται με οποιαδήποτε στήλη-μεταβλητή του πλαισίου δεδομένων) γιατί αποτελείται από διαφορετικού τύπου τιμές
> 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
Όλο το πλαίσιο δεδομένων είναι ένας πίνακας. Δίνουμε κριτήριο για τις γραμμές του, βάζουμε κόμμα και δεν γράφουμε τίποτα για στήλη για να τις πάρουμε όλες.
> df$id[df$height>160]
[1] "Marc" "Kelly" "George" "Peter"
Τα ονόματα είναι στοιχεία της μεταβλητής id που είναι ένα διάνυσμα. Δεν γράφουμε γραμμές και στήλες με διαχωριστικό το κόμμα, γιατί δεν είναι πίνακας παρά μόνο δίνουμε κριτήριο για τις τιμές του διανύσματος.
> df[df$h>160 & df$sex=="Female",]
id sex height smoking
3 Kelly Female 167 FALSE
> df$id[df$h>160 & df$sex=="Female"]
[1] "Kelly"
> mean(df$height[df$sex=="Female"])
[1] 163.5
> max(df$height[df$smoking==T])
[1] 180
> 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
Δημιουργώ νέα στήλη
> 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
Δημιουργώ νέα στήλη
> 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() συνενώνει διάνυσμα με πλαίσιο δεδομένων και δημιουργεί νέα στήλη
> 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() συνενώνει λίστα με πλαίσιο δεδομένων και δημιουργεί νέα γραμμή
> 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() συνενώνει δύο πλαίσια δεδομένων και δημιουργεί νέα γραμμή (θα μπορούσε και περισσότερες).
> 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() συνενώνει δύο πλαίσια δεδομένων χωρίς επεξεργασία για κοινές στήλες
> 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
> 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
> 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η θέση του ταξινομημένου διανύσματος κ.ο.κ.
> 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 κοκ
> 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(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 που τα είχαμε ορίσει νωρίτερα
> detach(total)
> smoking
Error: object 'smoking' not found
> total$smoking
[1] TRUE FALSE FALSE TRUE FALSE FALSE